From b4c18e7fb2e1cb7847c3ef99c19b0616901bcb15 Mon Sep 17 00:00:00 2001 From: robertlipe Date: Mon, 17 Jun 2013 02:07:08 +0000 Subject: [PATCH] A ridiculously large commit as a checkpoint in refactoring the time_t + an int for microseconds into a QDateTime to give us sensible interface to time beyond 1970 and 2032 and, more topically, more unified handling of sub-second time now that 10Hz GPSes aren't uncommon. This gets almost all of the accesses to wpt->creation_time into accessors (with overloads for int/time_t and QDateTime) and eliminates many of the problematic direct accesses to wpt->microseconds. --- .../UserInterfaceState.xcuserstate | Bin 155842 -> 131332 bytes gpsbabel/alan.cc | 4 +- gpsbabel/an1.cc | 4 +- gpsbabel/axim_gpb.cc | 2 +- gpsbabel/brauniger_iq.cc | 2 +- gpsbabel/cetus.cc | 4 +- gpsbabel/coastexp.cc | 6 +- gpsbabel/compegps.cc | 6 +- gpsbabel/coto.cc | 2 +- gpsbabel/cst.cc | 2 +- gpsbabel/csv_util.cc | 38 +++++---- gpsbabel/defs.h | 10 ++- gpsbabel/delbin.cc | 14 ++-- gpsbabel/delgpl.cc | 4 +- gpsbabel/destinator.cc | 6 +- gpsbabel/dg-100.cc | 2 +- gpsbabel/exif.cc | 2 +- gpsbabel/g7towin.cc | 4 +- gpsbabel/garmin.cc | 10 +-- gpsbabel/garmin_device_xml.h | 2 +- gpsbabel/garmin_txt.cc | 10 +-- gpsbabel/garmin_xt.cc | 6 +- gpsbabel/gcdb.cc | 4 +- gpsbabel/gdb.cc | 4 +- gpsbabel/geoniche.cc | 6 +- gpsbabel/ggv_log.cc | 4 +- gpsbabel/glogbook.cc | 4 +- gpsbabel/gnav_trl.cc | 4 +- gpsbabel/gopal.cc | 4 +- gpsbabel/gpilots.cc | 2 +- gpsbabel/gpssim.cc | 2 +- gpsbabel/gpsutil.cc | 2 +- gpsbabel/gpx.cc | 33 ++++---- gpsbabel/gtm.cc | 4 +- gpsbabel/gtrnctr.cc | 18 ++--- gpsbabel/hiketech.cc | 4 +- gpsbabel/holux.cc | 8 +- gpsbabel/hsa_ndv.cc | 2 +- gpsbabel/html.cc | 2 +- gpsbabel/humminbird.cc | 10 +-- gpsbabel/igc.cc | 26 +++---- gpsbabel/igo8.cc | 2 +- gpsbabel/jtr.cc | 5 +- gpsbabel/kml.cc | 72 ++++++++---------- gpsbabel/magproto.cc | 5 +- gpsbabel/mapsend.cc | 7 +- gpsbabel/mapsource.cc | 9 +-- gpsbabel/mmo.cc | 4 +- gpsbabel/mtk_locus.cc | 6 +- gpsbabel/navicache.cc | 2 +- gpsbabel/navilink.cc | 10 +-- gpsbabel/nmea.cc | 8 +- gpsbabel/osm.cc | 5 +- gpsbabel/ozi.cc | 2 +- gpsbabel/palmdoc.cc | 2 +- gpsbabel/pathaway.cc | 2 +- gpsbabel/pcx.cc | 6 +- gpsbabel/pocketfms_bc.cc | 6 +- gpsbabel/psitrex.cc | 22 +++--- gpsbabel/raymarine.cc | 4 +- gpsbabel/route.cc | 8 +- gpsbabel/saroute.cc | 7 +- gpsbabel/sbn.cc | 2 +- gpsbabel/skyforce.cc | 4 +- gpsbabel/skytraq.cc | 2 +- gpsbabel/smplrout.cc | 4 +- gpsbabel/sort.cc | 2 +- gpsbabel/src/core/datetime.h | 3 + gpsbabel/stmsdf.cc | 16 ++-- gpsbabel/stmwpp.cc | 4 +- gpsbabel/subrip.cc | 10 +-- gpsbabel/text.cc | 2 +- gpsbabel/tiger.cc | 2 +- gpsbabel/trackfilter.cc | 29 ++++--- gpsbabel/unicsv.cc | 16 ++-- gpsbabel/v900.cc | 2 +- gpsbabel/vitosmt.cc | 8 +- gpsbabel/vitovtt.cc | 3 +- gpsbabel/vpl.cc | 2 +- gpsbabel/waypt.cc | 19 +++++ gpsbabel/wbt-200.cc | 2 +- gpsbabel/wfff_xml.cc | 2 +- gpsbabel/wintec_tes.cc | 2 +- gpsbabel/xmlgeneric.cc | 39 ++++------ gpsbabel/xmlgeneric.h | 3 +- gpsbabel/xol.cc | 8 +- 86 files changed, 332 insertions(+), 331 deletions(-) diff --git a/gpsbabel/GPSBabel.xcodeproj/project.xcworkspace/xcuserdata/robertlipe.xcuserdatad/UserInterfaceState.xcuserstate b/gpsbabel/GPSBabel.xcodeproj/project.xcworkspace/xcuserdata/robertlipe.xcuserdatad/UserInterfaceState.xcuserstate index ca4bc1663d56f454e0912ad9b1c75b6a87657f57..f504b6e2d70cb1619d3d9564a1e21cc99f361092 100644 GIT binary patch literal 131332 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 z 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 = -pt2deg(wpt->pt.y); WP->longitude = pt2deg(wpt->pt.x); - WP->creation_time = unpack_time(wpt->date, wpt->time); + WP->SetCreationTime(unpack_time(wpt->date, wpt->time)); for (j=WPT_NAME_LEN-1; j >= 0 && wpt->name[j] == ' '; j--) {}; WP->shortname = xstrndup(wpt->name,j+1); for (j=WPT_COMMENT_LEN-1; j >= 0 && wpt->comment[j] == ' '; j--) {}; @@ -706,7 +706,7 @@ static int add_wpt(struct wprdata* wprdata, const waypoint* WP,int isroute) wpt->usecount = isroute ? 1 : 0; wpt->checked = isroute ? 0 : 1; wpt->reserved = 0; - pack_time(WP->creation_time, &(wpt->date), &(wpt->time)); + pack_time(WP->GetCreationTime(), &(wpt->date), &(wpt->time)); wpthdr->idx[hdr_idx] = wpt_idx; wpthdr->used[wpt_idx] = WPT_USED; diff --git a/gpsbabel/an1.cc b/gpsbabel/an1.cc index 480f29a41..63ca40309 100644 --- a/gpsbabel/an1.cc +++ b/gpsbabel/an1.cc @@ -703,7 +703,7 @@ static void Read_AN1_Waypoints(gbfile* f) wpt_tmp = waypt_new(); if (rec->creation_time) { - wpt_tmp->creation_time = rec->creation_time; + wpt_tmp->SetCreationTime(rec->creation_time); } wpt_tmp->longitude = -DecodeOrd(rec->lon); wpt_tmp->latitude = DecodeOrd(rec->lat); @@ -795,7 +795,7 @@ Write_One_AN1_Waypoint(const waypoint* wpt) } - rec->creation_time = rec->modification_time = wpt->creation_time; + rec->creation_time = rec->modification_time = wpt->GetCreationTime(); rec->lat = EncodeOrd(wpt->latitude); rec->lon = EncodeOrd(-wpt->longitude); rec->serial = serial++; diff --git a/gpsbabel/axim_gpb.cc b/gpsbabel/axim_gpb.cc index 424fc141d..3190576a3 100644 --- a/gpsbabel/axim_gpb.cc +++ b/gpsbabel/axim_gpb.cc @@ -114,7 +114,7 @@ decode_buff(const char* buff, route_head* track) tm.tm_year-=1900; tm.tm_mon--; - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); track_add_wpt(track, wpt); } diff --git a/gpsbabel/brauniger_iq.cc b/gpsbabel/brauniger_iq.cc index 30d0024b3..c0e725d9a 100644 --- a/gpsbabel/brauniger_iq.cc +++ b/gpsbabel/brauniger_iq.cc @@ -202,7 +202,7 @@ static int process_data(const unsigned char* data) case st_sample_alt: wpt = waypt_new(); wpt->latitude = wpt->longitude = 0.0; - wpt->creation_time = creation; + wpt->SetCreationTime(creation); creation += interval; wpt->altitude = (data[0] << 8) + data[1]; track_add_wpt(track, wpt); diff --git a/gpsbabel/cetus.cc b/gpsbabel/cetus.cc index 0e3925ca4..022d22cec 100644 --- a/gpsbabel/cetus.cc +++ b/gpsbabel/cetus.cc @@ -455,12 +455,12 @@ cetus_writewpt(const waypoint* wpt) rec = (struct cetus_wpt_s*) xcalloc(sizeof(*rec)+18 + NOTESZ + DESCSZ,1); - QDate date(wpt->creation_time.date()); + QDate date(wpt->GetCreationTime().date()); rec->day = date.day(); rec->mon = date.month(); be_write16(&rec->year, date.year()); - QTime time(wpt->creation_time.time()); + QTime time(wpt->GetCreationTime().time()); rec->min = time.minute(); rec->hour = time.hour(); rec->sec = time.second(); diff --git a/gpsbabel/coastexp.cc b/gpsbabel/coastexp.cc index 7aa72c74c..030ca04ea 100644 --- a/gpsbabel/coastexp.cc +++ b/gpsbabel/coastexp.cc @@ -292,7 +292,7 @@ ce_cdata(void* dta, const XML_Char* xml_s, int len) strncpy(secString, currentMark->created+13, 2); secString[2] = '\0'; t.tm_sec = atoi(secString); - currentMark->wp->creation_time = mkgmtime(&t); + currentMark->wp->SetCreationTime(mkgmtime(&t)); } } else if (inRoute) { currentRoute->r->rte_name = xstrdup(s); @@ -524,7 +524,7 @@ ce_wr_deinit(void) static char* ce_gen_creation_time(time_t tm) { - xml_fill_in_time(time_buffer, tm, 0, XML_SHORT_TIME); + xml_fill_in_time(time_buffer, tm, XML_SHORT_TIME); return time_buffer; } @@ -660,7 +660,7 @@ ce_mark_pr(const waypoint* wp) id = xml_buffer; } write_xml_entity_begin2(ofd, "\t", "Mark", - "created", ce_gen_creation_time(wp->creation_time), + "created", ce_gen_creation_time(wp->GetCreationTime()), "id", id); ce_waypt_pr(wp); write_xml_entity_end(ofd, "\t", "Mark"); diff --git a/gpsbabel/compegps.cc b/gpsbabel/compegps.cc index b078acbb7..9a8251b0b 100644 --- a/gpsbabel/compegps.cc +++ b/gpsbabel/compegps.cc @@ -207,7 +207,7 @@ parse_wpt(char* buff) case 5: if (has_time) { compegps_parse_time(c, &tm); - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); } case 6: wpt->altitude = atof(c); @@ -305,7 +305,7 @@ parse_trkpt(char* buff) break; case 5: compegps_parse_time(c, &tm); - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); break; case 7: wpt->altitude = atof(c); @@ -562,7 +562,7 @@ write_trkpt_cb(const waypoint* wpt) buff[0] = '\0'; if (wpt->creation_time != 0) { - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); struct tm tm = *gmtime(&tt); strftime(buff, sizeof(buff), "%d-%b-%y %H:%M:%S", &tm); diff --git a/gpsbabel/coto.cc b/gpsbabel/coto.cc index adf5775f5..b2141badb 100644 --- a/gpsbabel/coto.cc +++ b/gpsbabel/coto.cc @@ -243,7 +243,7 @@ coto_track_read(void) rec->time = be_read32(&rec->time); if (rec->time != 0) { rec->time -= 2082844800U; - wpt_tmp->creation_time = rec->time; + wpt_tmp->SetCreationTime(rec->time); } track_add_wpt(trk_head, wpt_tmp); } diff --git a/gpsbabel/cst.cc b/gpsbabel/cst.cc index aca0cac02..f13f9c9e7 100644 --- a/gpsbabel/cst.cc +++ b/gpsbabel/cst.cc @@ -292,7 +292,7 @@ cst_data_read(void) pow = lrtrim(++pow); strptime(pow, "%Y %m %d %H:%M:%S", &tm); - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); } wpt->latitude /= 100000.0; wpt->longitude /= 100000.0; diff --git a/gpsbabel/csv_util.cc b/gpsbabel/csv_util.cc index 4af5ba618..a13028360 100644 --- a/gpsbabel/csv_util.cc +++ b/gpsbabel/csv_util.cc @@ -1173,37 +1173,36 @@ xcsv_parse_val(const char* s, waypoint* wpt, const field_map_t* fmp, /* TIME CONVERSIONS ***************************************************/ case XT_EXCEL_TIME: /* Time as Excel Time */ - wpt->creation_time = EXCEL_TO_TIMET(atof(s)); + wpt->SetCreationTime(EXCEL_TO_TIMET(atof(s))); break; case XT_TIMET_TIME: /* Time as time_t */ - wpt->creation_time = (time_t) atol(s); + wpt->SetCreationTime((time_t) atol(s)); break; case XT_TIMET_TIME_MS: { /* Time as time_t in milliseconds */ int s_len = strlen(s); if (s_len < 4) { /* less than 1 epochsecond, an unusual case */ - wpt->creation_time = (time_t) 0; - wpt->microseconds = (int) atoi(s) * 1000; + wpt->SetCreationTime(0,(int) atoi(s) * 1000); } else { char buff[32]; int off = s_len - 3; strncpy(buff, s, off); buff[off] = '\0'; - wpt->creation_time = (time_t) atol(buff); + time_t t = (time_t) atol(buff); s += off; strncpy(buff, s, 3); buff[3] = '\0'; - wpt->microseconds = (int) atoi(buff) * 1000; + wpt->SetCreationTime(t, (int) MILLI_TO_MICRO(atoi(buff))); } } break; case XT_YYYYMMDD_TIME: - wpt->creation_time = yyyymmdd_to_time(s); + wpt->SetCreationTime(yyyymmdd_to_time(s)); break; case XT_GMT_TIME: - wpt->creation_time += sscanftime(s, fmp->printfc, 1); + wpt->SetCreationTime(sscanftime(s, fmp->printfc, 1)); break; case XT_LOCAL_TIME: if (getenv("GPSBABEL_FREEZE_TIME")) { @@ -1224,7 +1223,7 @@ xcsv_parse_val(const char* s, waypoint* wpt, const field_map_t* fmp, wpt->creation_time = xml_parse_time(s, &wpt->microseconds); break; case XT_NET_TIME: { - time_t tt = wpt->creation_time; + time_t tt = wpt->GetCreationTime(); dotnet_time_to_time_t(atof(s), &tt, &wpt->microseconds); } break; @@ -1937,43 +1936,42 @@ xcsv_waypt_pr(const waypoint* wpt) /* TIME CONVERSIONS**************************************************/ case XT_EXCEL_TIME: /* creation time as an excel (double) time */ - writebuff(buff, fmp->printfc, TIMET_TO_EXCEL(wpt->creation_time)); + writebuff(buff, fmp->printfc, TIMET_TO_EXCEL(wpt->GetCreationTime())); break; case XT_TIMET_TIME: /* time as a time_t variable */ { - time_t tt = wpt->creation_time; + time_t tt = wpt->GetCreationTime(); writebuff(buff, fmp->printfc, tt); } break; case XT_TIMET_TIME_MS: { /* time as a time_t variable in milliseconds */ char tbuf[24]; - writetime(tbuf, sizeof(tbuf), "%s", wpt->creation_time, 0); + writetime(tbuf, sizeof(tbuf), "%s", wpt->GetCreationTime(), 0); char mbuf[32]; snprintf(mbuf, sizeof(mbuf), "%s%03d", tbuf, wpt->microseconds / 1000); writebuff(buff, "%s", mbuf); } break; case XT_YYYYMMDD_TIME: - writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->creation_time)); + writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->GetCreationTime())); break; case XT_GMT_TIME: - writetime(buff, sizeof buff, fmp->printfc, wpt->creation_time, 1); + writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 1); break; case XT_LOCAL_TIME: - writetime(buff, sizeof buff, fmp->printfc, wpt->creation_time, 0); + writetime(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 0); break; case XT_HMSG_TIME: - writehms(buff, sizeof buff, fmp->printfc, wpt->creation_time, 1); + writehms(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 1); break; case XT_HMSL_TIME: - writehms(buff, sizeof buff, fmp->printfc, wpt->creation_time, 0); + writehms(buff, sizeof buff, fmp->printfc, wpt->GetCreationTime(), 0); break; case XT_ISO_TIME: - writetime(buff, sizeof buff, "%Y-%m-%dT%H:%M:%SZ", wpt->creation_time, 1); + writetime(buff, sizeof buff, "%Y-%m-%dT%H:%M:%SZ", wpt->GetCreationTime(), 1); break; case XT_ISO_TIME_MS: - xml_fill_in_time(buff, wpt->creation_time, - wpt->microseconds, XML_LONG_TIME); + xml_fill_in_time(buff, wpt->GetCreationTime(), XML_LONG_TIME); break; case XT_GEOCACHE_LAST_FOUND: writebuff(buff, fmp->printfc, time_to_yyyymmdd(wpt->gc_data->last_found)); diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index 77d0ef73f..7256c5ca9 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -467,6 +467,7 @@ public: session(NULL), extra_data(NULL) { } public: + QString CreationTimeXML() const; queue Q; /* Master waypoint q. Not for use by modules. */ @@ -524,6 +525,13 @@ public: wp_flags wpt_flags; QString icon_descr; + + gpsbabel::DateTime GetCreationTime() const { return creation_time; } + void SetCreationTime(time_t t) { creation_time = t; } + void SetCreationTime(time_t t, int us) { + creation_time = t; + microseconds = us; + } gpsbabel::DateTime creation_time; int microseconds; /* Optional millionths of a second. */ @@ -1009,7 +1017,7 @@ const char* get_filename(const char* fname); /* extract the filename portion * #define str_iso8859_1_to_utf8(str) cet_str_iso8859_1_to_utf8((str)) /* this lives in gpx.c */ -time_t xml_parse_time(const char* cdatastr, int* microsecs); +gpsbabel::DateTime xml_parse_time(const char* cdatastr, int* microsecs); xml_tag* xml_findfirst(xml_tag* root, const char* tagname); xml_tag* xml_findnext(xml_tag* root, xml_tag* cur, const char* tagname); diff --git a/gpsbabel/delbin.cc b/gpsbabel/delbin.cc index aabd1a1de..5fd44609a 100644 --- a/gpsbabel/delbin.cc +++ b/gpsbabel/delbin.cc @@ -998,7 +998,7 @@ decode_waypoint(const void* data) const char* s; float f; - wp->creation_time = decode_time(&p->year); + wp->SetCreationTime(decode_time(&p->year)); wp->latitude = delbin_rad2deg(le_read32(p->latitude)); wp->longitude = delbin_rad2deg(le_read32(p->longitude)); f = le_read_float(p->elevation); @@ -1414,7 +1414,7 @@ write_waypoint(const waypoint* wp) waypoint_i++; le_write32(p->total, waypoint_n); le_write32(p->index, waypoint_i); - encode_time(wp->creation_time, &p->year); + encode_time(wp->GetCreationTime(), &p->year); le_write32(p->latitude, delbin_deg2rad(wp->latitude)); le_write32(p->longitude, delbin_deg2rad(wp->longitude)); if (wp->altitude > unknown_alt) { @@ -1529,7 +1529,7 @@ decode_track_point(const void* data, unsigned* wp_array_i, unsigned max_point) waypoint* wp = waypt_new(); float elev = le_read_float(p->point[i].elevation); wp_array[j] = wp; - wp->creation_time = decode_time(&p->point[i].year); + wp->SetCreationTime(decode_time(&p->point[i].year)); wp->latitude = delbin_rad2deg(le_read32(p->point[i].latitude)); wp->longitude = delbin_rad2deg(le_read32(p->point[i].longitude)); if (elev > UNKNOWN_ELEV) { @@ -1713,7 +1713,7 @@ write_track_points(void) le_write32(p->index, i + 1); } assert(p); - encode_time(wp->creation_time, &p->point[j].year); + encode_time(wp->GetCreationTime(), &p->point[j].year); le_write32(p->point[j].latitude, delbin_deg2rad(wp->latitude)); le_write32(p->point[j].longitude, delbin_deg2rad(wp->longitude)); f = UNKNOWN_ELEV; @@ -1793,7 +1793,7 @@ write_track_end(const route_head* track) if (track->rte_name) { strncpy(p->name, track->rte_name, sizeof(p->name) - 1); } else { - sprintf(p->name, "%lu", (long)wp_array[0]->creation_time); + sprintf(p->name, "%lu", (long)wp_array[0]->GetCreationTime()); } le_write32(p->total_points, waypoint_n); encode_time(current_time(), &p->year); @@ -2186,7 +2186,7 @@ write_route_end(const route_head* route) if (route->rte_name) { strncpy(p->name, route->rte_name, sizeof(p->name) - 1); } else { - sprintf(p->name, "%lu", (long)wp_array[0]->creation_time); + sprintf(p->name, "%lu", (long)wp_array[0]->GetCreationTime()); } p->type = 0; le_write32(p->total_route_point, route_point_n); @@ -2222,7 +2222,7 @@ decode_navmsg(const void* data) t.tm_hour = p->hour; t.tm_min = p->minute; t.tm_sec = p->second; - wp->creation_time = mkgmtime(&t); + wp->SetCreationTime(mkgmtime(&t)); wp->sat = p->satellites; wp->latitude = le_read_double(p->latitude); wp->longitude = le_read_double(p->longitude); diff --git a/gpsbabel/delgpl.cc b/gpsbabel/delgpl.cc index 29006c7ff..a51c1d870 100644 --- a/gpsbabel/delgpl.cc +++ b/gpsbabel/delgpl.cc @@ -71,7 +71,7 @@ gpl_read(void) if (wpt_tmp->altitude <= unknown_alt + 1) { wpt_tmp->altitude = unknown_alt; } - wpt_tmp->creation_time = le_read32(&gp.tm); + wpt_tmp->SetCreationTime(le_read32(&gp.tm)); switch (le_read32(&gp.status)) { case 1: @@ -154,7 +154,7 @@ gpl_trackpt(const waypoint* wpt) le_write_double(&gp.alt, alt_feet); le_write_double(&gp.speed, speed); le_write_double(&gp.heading, heading); - le_write32(&gp.tm, wpt->creation_time); + le_write32(&gp.tm, wpt->GetCreationTime()); gbfwrite(&gp, sizeof(gp), 1, gplfile_out); } diff --git a/gpsbabel/destinator.cc b/gpsbabel/destinator.cc index 1de34ea3d..f56a08875 100644 --- a/gpsbabel/destinator.cc +++ b/gpsbabel/destinator.cc @@ -332,8 +332,8 @@ destinator_read_trk(void) snprintf(buff, sizeof(buff), "%06d%.f", date, time); strptime(buff, "%d%m%y%H%M%S", &tm); - wpt->creation_time = mkgmtime(&tm); - wpt->microseconds = ((int)time % 1000) * 1000; + wpt->SetCreationTime(mkgmtime(&tm), + ((int)time % 1000) * 1000); if (wpt->fix > 0) { wpt->fix = (fix_type)(wpt->fix + 1); @@ -438,7 +438,7 @@ destinator_trkpt_disp(const waypoint* wpt) struct tm tm; double time; int date; - const time_t ct = wpt->creation_time; + const time_t ct = wpt->GetCreationTime(); tm = *gmtime(&ct); tm.tm_mon += 1; tm.tm_year -= 100; diff --git a/gpsbabel/dg-100.cc b/gpsbabel/dg-100.cc index b64d43868..b6ffbd9e7 100644 --- a/gpsbabel/dg-100.cc +++ b/gpsbabel/dg-100.cc @@ -282,7 +282,7 @@ process_gpsfile(gbuint8 data[], route_head** track) if (style >= 1) { bintime = be_read32(data + i + 8) & 0x7FFFFFFF; bindate = be_read32(data + i + 12); - wpt->creation_time = bintime2utc(bindate, bintime); + wpt->SetCreationTime(bintime2utc(bindate, bintime)); /* The device presents the speed as a fixed-point number * with a scaling factor of 100, in km/h. * The waypoint struct wants the speed as a diff --git a/gpsbabel/exif.cc b/gpsbabel/exif.cc index 5e906b013..73450a9d0 100644 --- a/gpsbabel/exif.cc +++ b/gpsbabel/exif.cc @@ -1503,7 +1503,7 @@ exif_write(void) struct tm tm; char buf[32]; - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *gmtime(&tt); tm.tm_year += 1900; diff --git a/gpsbabel/g7towin.cc b/gpsbabel/g7towin.cc index b910d6146..cf48069af 100644 --- a/gpsbabel/g7towin.cc +++ b/gpsbabel/g7towin.cc @@ -105,7 +105,7 @@ parse_line(char* buff, int index, const char* delimiter, waypoint* wpt) if (cerr == NULL) { fatal(MYNAME ": Unable to convert date (%s)!\n", cin); } - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); break; case WAYPT__OFS + 1: @@ -317,7 +317,7 @@ parse_waypt(char* buff) if (cerr == NULL) { fatal(MYNAME ": Unable to convert date (%s)!\n", buff); } - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); /* go over time stamp */ i = 5; diff --git a/gpsbabel/garmin.cc b/gpsbabel/garmin.cc index c865171f6..60eadbf65 100644 --- a/gpsbabel/garmin.cc +++ b/gpsbabel/garmin.cc @@ -345,7 +345,7 @@ waypt_read(void) wpt->longitude = gps_save_lon; wpt->shortname = xstrdup("Position"); if (gps_save_time) { - wpt->creation_time = gps_save_time; + wpt->SetCreationTime(gps_save_time); } waypt_add(wpt); return; @@ -390,7 +390,7 @@ waypt_read(void) wpt_tmp->altitude = way[i]->alt; } if (way[i]->time_populated) { - wpt_tmp->creation_time = way[i]->time; + wpt_tmp->SetCreationTime(way[i]->time); } #if SOON garmin_fs_garmin_after_read(way[i], wpt_tmp, gps_waypt_type); @@ -418,7 +418,7 @@ unsigned int checkWayPointIsAtSplit(waypoint* wpt, GPS_PLap* laps, int nlaps) int i; for (i=(nlaps-1); i >= 0; i--) { GPS_PLap lap = laps[i]; - time_t delta = lap->start_time - wpt->creation_time; + time_t delta = lap->start_time - wpt->GetCreationTime(); if ((delta >= -1) && (delta <= 1)) { result = 1; break; @@ -503,7 +503,7 @@ track_read(void) wpt->heartrate = array[i]->heartrate; wpt->cadence = array[i]->cadence; wpt->shortname = xstrdup(array[i]->trk_ident); - wpt->creation_time = array[i]->Time; + wpt->SetCreationTime(array[i]->Time); wpt->wpt_flags.is_split = checkWayPointIsAtSplit(wpt, laps, nlaps); wpt->wpt_flags.new_trkseg = next_is_new_trkseg; @@ -985,7 +985,7 @@ waypoint_prepare(void) tx_waylist[i]->alt = wpt->altitude; } if (wpt->creation_time) { - tx_waylist[i]->time = wpt->creation_time; + tx_waylist[i]->time = wpt->GetCreationTime(); tx_waylist[i]->time_populated = 1; } if (category) { diff --git a/gpsbabel/garmin_device_xml.h b/gpsbabel/garmin_device_xml.h index 1edd98ded..4ee325c6b 100644 --- a/gpsbabel/garmin_device_xml.h +++ b/gpsbabel/garmin_device_xml.h @@ -1437,7 +1437,7 @@ gpx_write_common_position(const waypoint* waypointp, const char* indent) indent, waypointp->altitude); } if (waypointp->creation_time) { - xml_write_time(ofd, waypointp->creation_time, waypointp->microseconds, "time"); + xml_write_time(ofd, waypointp->GetCreationTime(), waypointp->microseconds, "time"); } } diff --git a/gpsbabel/garmin_txt.cc b/gpsbabel/garmin_txt.cc index b66e6da4d..88500f684 100644 --- a/gpsbabel/garmin_txt.cc +++ b/gpsbabel/garmin_txt.cc @@ -255,11 +255,11 @@ prework_wpt_cb(const waypoint* wpt) waypoint* prev = cur_info->prev_wpt; if (prev != NULL) { - cur_info->time += (wpt->creation_time - prev->creation_time); + cur_info->time += (wpt->GetCreationTime() - prev->GetCreationTime()); cur_info->length += waypt_distance_ex(prev, wpt); } else { cur_info->first_wpt = (waypoint*)wpt; - cur_info->start = wpt->creation_time; + cur_info->start = wpt->GetCreationTime(); } cur_info->prev_wpt = (waypoint*)wpt; cur_info->count++; @@ -618,7 +618,7 @@ write_waypt(const waypoint* wpt) print_string("%s\t", GMSD_GET(state, "")); country = gt_get_icao_country(GMSD_GET(cc, "")); print_string("%s\t", (country != NULL) ? country : ""); - print_date_and_time(wpt->creation_time, 0); + print_date_and_time(wpt->GetCreationTime(), 0); print_string("%s\t", wpt->hasLink() ? wpt->url : ""); print_categories(GMSD_GET(category, 0)); @@ -719,7 +719,7 @@ track_disp_wpt_cb(const waypoint* wpt) gbfprintf(fout, "Trackpoint\t"); print_position(wpt); - print_date_and_time(wpt->creation_time, 0); + print_date_and_time(wpt->GetCreationTime(), 0); if IS_VALID_ALT(wpt->altitude) { print_distance(wpt->altitude, 1, 0, 0); } @@ -733,7 +733,7 @@ track_disp_wpt_cb(const waypoint* wpt) if (prev != NULL) { float temp; gbfprintf(fout, "\t"); - delta = wpt->creation_time - prev->creation_time; + delta = wpt->GetCreationTime() - prev->GetCreationTime(); temp = WAYPT_GET(wpt, temperature, -999); if (temp != -999) { print_temperature(temp); diff --git a/gpsbabel/garmin_xt.cc b/gpsbabel/garmin_xt.cc index 38fedfa04..6b07e95b4 100644 --- a/gpsbabel/garmin_xt.cc +++ b/gpsbabel/garmin_xt.cc @@ -298,7 +298,7 @@ format_garmin_xt_proc_strk(void) wpt->latitude = PrevLat; /* Degrees */ wpt->longitude = PrevLon; /* Degrees */ wpt->altitude = PrevEle; /* Meters. */ - wpt->creation_time = Time; /* Unix Time adjusted to Garmin time */ + wpt->SetCreationTime(Time); /* Unix Time adjusted to Garmin time */ // add way point to the track track_add_wpt(tmp_track, wpt); @@ -324,7 +324,7 @@ format_garmin_xt_proc_strk(void) wpt->latitude = PrevLat; /* Degrees */ wpt->longitude = PrevLon; /* Degrees */ wpt->altitude = PrevEle; /* Meters. */ - wpt->creation_time = Time; /* Unix Time adjusted to Garmin time */ + wpt->SetCreationTime(Time); /* Unix Time adjusted to Garmin time */ // add way point to the track track_add_wpt(tmp_track, wpt); @@ -396,7 +396,7 @@ format_garmin_xt_proc_atrk(void) wpt->latitude = LatF*180/16777216; /* Degrees */ wpt->longitude = LonF*360/16777216; /* Degrees */ wpt->altitude = AltF; /* Meters. */ - wpt->creation_time = Tim; /* Unix Time adjusted to Garmin time */ + wpt->SetCreationTime(Tim); /* Unix Time adjusted to Garmin time */ track_add_wpt(track, wpt); } diff --git a/gpsbabel/gcdb.cc b/gpsbabel/gcdb.cc index 76a744b06..e24993e70 100644 --- a/gpsbabel/gcdb.cc +++ b/gpsbabel/gcdb.cc @@ -154,7 +154,7 @@ if (!strncmp("date", rec->dbfld[i].fldname,4)) { time_t tm; tm = be_read32(recdata) * 24 * 3600; tm -= EPOCH_1904; -wpt->creation_time = tm; +wpt->SetCreationTime(tm); warning("date %d\n", tm); } break; @@ -266,7 +266,7 @@ gcdb_add_to_rec(rec, "terr", RECTYPE_TEXT, tbuf); * not the cache creation date. */ if (wpt->creation_time) { -gcdb_add_to_rec(rec, "date", RECTYPE_DATE, (void*) wpt->creation_time); +gcdb_add_to_rec(rec, "date", RECTYPE_DATE, (void*) wpt->GetCreationTime()); } #endif diff --git a/gpsbabel/gdb.cc b/gpsbabel/gdb.cc index 3d679b826..b3508ff3b 100644 --- a/gpsbabel/gdb.cc +++ b/gpsbabel/gdb.cc @@ -1406,7 +1406,7 @@ write_waypoint( FWRITE_i16(GMSD_GET(category, gdb_category)); FWRITE_DBL(WAYPT_GET(wpt, temperature, 0), 0); - FWRITE_TIME(wpt->creation_time); + FWRITE_TIME(wpt->GetCreationTime()); /* VERSION DEPENDENT CODE */ if (gdb_ver >= GDB_VER_3) { @@ -1588,7 +1588,7 @@ write_track(const route_head* trk, const char* trk_name) FWRITE_LATLON(wpt->latitude); FWRITE_LATLON(wpt->longitude); FWRITE_DBL(wpt->altitude, unknown_alt); - FWRITE_TIME(wpt->creation_time); + FWRITE_TIME(wpt->GetCreationTime()); d = WAYPT_GET(wpt, depth, unknown_alt); FWRITE_DBL(d, unknown_alt); d = WAYPT_GET(wpt, temperature, -99999); diff --git a/gpsbabel/geoniche.cc b/gpsbabel/geoniche.cc index 482e76a14..e2d92d844 100644 --- a/gpsbabel/geoniche.cc +++ b/gpsbabel/geoniche.cc @@ -378,7 +378,7 @@ geoniche_read_asc(void) tm.tm_year -= 1900; sscanf(timestr, "%d:%d:%d", &tm.tm_hour, &tm.tm_min, &tm.tm_sec); if (tm.tm_year >= 1970) { - wpt->creation_time = mktime(&tm); + wpt->SetCreationTime(mktime(&tm)); } xfree(datestr); xfree(timestr); @@ -540,7 +540,7 @@ geoniche_read_bin(void) waypt->shortname = xstrdup(vdata + 63); waypt->altitude = altitude; - waypt->creation_time = mkgmtime(&created); + waypt->SetCreationTime(mkgmtime(&created)); GPS_Math_DegMin_To_Deg(latdeg, lat, &waypt->latitude); GPS_Math_DegMin_To_Deg(londeg, lon, &waypt->longitude); @@ -749,7 +749,7 @@ geoniche_writewpt(const waypoint* wpt) id = rec_ct; } - tx = (wpt->creation_time != 0) ? wpt->creation_time : gpsbabel_time; + tx = (wpt->GetCreationTime() != 0) ? wpt->GetCreationTime() : gpsbabel_time; if (tx == 0) { /* maybe zero during testo (freezed time) */ strcpy(datestr, "01/01/1904"); /* this seems to be the uninitialized date value for geoniche */ strcpy(timestr, "00:00:00"); diff --git a/gpsbabel/ggv_log.cc b/gpsbabel/ggv_log.cc index 5994bb6c1..c2a3572e8 100644 --- a/gpsbabel/ggv_log.cc +++ b/gpsbabel/ggv_log.cc @@ -179,7 +179,7 @@ ggv_log_read(void) tm.tm_year -= 1900; if (tm.tm_mon > 0) { tm.tm_mon--; - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); } } @@ -224,7 +224,7 @@ ggv_log_track_head_cb(const route_head* trk) lonsec = 60.0 * (lonmin - floor(lonmin)); if (wpt->creation_time > 0) { - tm = *gmtime(&wpt->creation_time); + tm = *gmtime(&wpt->GetCreationTime()); tm.tm_mon += 1; tm.tm_year += 1900; } else { diff --git a/gpsbabel/glogbook.cc b/gpsbabel/glogbook.cc index b42b6abeb..cbdd07733 100644 --- a/gpsbabel/glogbook.cc +++ b/gpsbabel/glogbook.cc @@ -96,7 +96,7 @@ glogbook_waypt_pr(const waypoint* wpt) } gbfprintf(ofd, " \n"); gbfprintf(ofd, " "); - xml_write_time(ofd, wpt->creation_time, wpt->microseconds, "Time"); + xml_write_time(ofd, wpt->GetCreationTime(), wpt->microseconds, "Time"); gbfprintf(ofd, " \n"); } @@ -147,7 +147,7 @@ void gl_trk_pnt_e(const char* args, const char** unused) void gl_trk_utc(const char* args, const char** unused) { - wpt_tmp->creation_time = xml_parse_time(args, &wpt_tmp->microseconds); + wpt_tmp->SetCreationTime(xml_parse_time(args, &wpt_tmp->microseconds)); } void gl_trk_lat(const char* args, const char** unused) diff --git a/gpsbabel/gnav_trl.cc b/gpsbabel/gnav_trl.cc index dc5216dee..e15e6422d 100644 --- a/gpsbabel/gnav_trl.cc +++ b/gpsbabel/gnav_trl.cc @@ -100,7 +100,7 @@ gnav_trl_read(void) wpt = waypt_new(); - wpt->creation_time = le_read32(&rec.time); + wpt->SetCreationTime(le_read32(&rec.time)); wpt->latitude = le_read_float(&rec.lat); wpt->longitude = le_read_float(&rec.lon); wpt->altitude = read_altitude(&rec.alt); @@ -118,7 +118,7 @@ gnav_trl_write_trkpt(const waypoint* wpt) { gnav_trl_t rec; - le_write32(&rec.time, wpt->creation_time); + le_write32(&rec.time, wpt->GetCreationTime()); le_write_float(&rec.lat, wpt->latitude); le_write_float(&rec.lon, wpt->longitude); if (wpt->altitude != unknown_alt) { diff --git a/gpsbabel/gopal.cc b/gpsbabel/gopal.cc index 59e9cdfb1..10c3b323d 100644 --- a/gpsbabel/gopal.cc +++ b/gpsbabel/gopal.cc @@ -308,7 +308,7 @@ gopal_read(void) //calculate the speed to reach this waypoint from the last. This way I try to sort out invalid waypoints speed=0; if (lastwpt !=NULL) { - speed=3.6*radtometers(gcdist(RAD(lastwpt->latitude), RAD(lastwpt->longitude), RAD(wpt->latitude), RAD(wpt->longitude))) / abs(wpt->creation_time - lastwpt->creation_time); + speed=3.6*radtometers(gcdist(RAD(lastwpt->latitude), RAD(lastwpt->longitude), RAD(wpt->latitude), RAD(wpt->longitude))) / abs(wpt->creation_time - lastwpt->GetCreationTime()); //printf("speed line %d %lf \n",line,speed); } /* Error handling: in the tracklog of my device sometimes "jump" waypoints ;-) */ @@ -366,7 +366,7 @@ gopal_write_waypt(const waypoint* wpt) } } //MSVC handles time_t as int64, gcc and mac only int32, so convert it: - timestamp=(unsigned long)wpt->creation_time; + timestamp=(unsigned long)wpt->GetCreationTime(); gbfprintf(fout, "%lu, %s, %lf, %lf, %5.1lf, %8.5lf, %d, %lf, %d\n",timestamp,tbuffer, wpt->longitude, wpt->latitude,wpt->altitude, wpt->speed,fix,wpt->hdop,wpt->sat); } diff --git a/gpsbabel/gpilots.cc b/gpsbabel/gpilots.cc index 56938403e..4e732359a 100644 --- a/gpsbabel/gpilots.cc +++ b/gpsbabel/gpilots.cc @@ -313,7 +313,7 @@ data_read(void) * Garmin/GPilotS count seconds from "UTC 12:00 AM December 31 1989". * gpsbabel counts seconds from "UTC 12:00 AM January 1 1970". */ - wpt_tmp->creation_time = be_read32(&tp_cust->time) + 631065600; + wpt_tmp->SetCreationTime(be_read32(&tp_cust->time) + 631065600); fi.i = be_read32(&tp_cust->alt); wpt_tmp->altitude = fi.f; track_add_wpt(track_head, wpt_tmp); diff --git a/gpsbabel/gpssim.cc b/gpsbabel/gpssim.cc index 79b4943e1..abf9728e7 100644 --- a/gpsbabel/gpssim.cc +++ b/gpsbabel/gpssim.cc @@ -126,7 +126,7 @@ gpssim_write_pt(const waypoint* wpt) int hms, ymd; struct tm* tm; - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = gmtime(&tt); hms = tm->tm_hour * 10000 + tm->tm_min * 100 + tm->tm_sec; ymd = tm->tm_mday * 10000 + tm->tm_mon * 100 + tm->tm_year; diff --git a/gpsbabel/gpsutil.cc b/gpsbabel/gpsutil.cc index b1c41445f..7e8b621ce 100644 --- a/gpsbabel/gpsutil.cc +++ b/gpsbabel/gpsutil.cc @@ -114,7 +114,7 @@ data_read(void) wpt_tmp->altitude = alt; wpt_tmp->shortname = sn; wpt_tmp->description = xstrdup(desc); - wpt_tmp->creation_time = now; + wpt_tmp->SetCreationTime(now); if (latdir == 'S') { lat = -lat; diff --git a/gpsbabel/gpx.cc b/gpsbabel/gpx.cc index 212aeca59..03fe746b5 100644 --- a/gpsbabel/gpx.cc +++ b/gpsbabel/gpx.cc @@ -31,6 +31,7 @@ static XML_Parser psr; #include //#include #include +#include static xml_tag* cur_tag; @@ -844,7 +845,7 @@ gs_get_container(geocache_container t) return "Unknown"; } -time_t +gpsbabel::DateTime xml_parse_time(const char* cdatastr, int* microsecs) { int off_hr = 0; @@ -909,7 +910,18 @@ xml_parse_time(const char* cdatastr, int* microsecs) xfree(timestr); - return rv; + // TOOD(robertlipe) - This really is a groady hack to shim in + // the old interface (which had an explicit microsecs pointer argument + // as an optional output value) and the new form which uses QDateTime + // but, because of the above hackery, doesn't really work outside 1970 + // 2038 but which we can't replace until Steven upgrades Qt. + // Baby steps. + QDateTime dt = QDateTime::fromTime_t(rv); + if (microsecs) { + dt = dt.addMSecs(*microsecs / 1000); +// qDebug() << dt.toString("dd.MM.yyyy hh:mm:ss.zzz") << " ZZZ " << *microsecs; + } + return dt; } static void @@ -1131,7 +1143,7 @@ gpx_end(void* data, const XML_Char* xml_el) case tt_wpt_time: case tt_trk_trkseg_trkpt_time: case tt_rte_rtept_time: - wpt_tmp->creation_time = xml_parse_time(cdatastrp, &wpt_tmp->microseconds); + wpt_tmp->SetCreationTime(xml_parse_time(cdatastrp, &wpt_tmp->microseconds)); break; case tt_wpt_cmt: case tt_rte_rtept_cmt: @@ -1437,7 +1449,7 @@ fprint_xml_chain(xml_tag* tag, const waypoint* wpt) strcmp(tag->tagname, "groundspeak:cache") == 0) { char time_string[64]; xml_fill_in_time(time_string, wpt->gc_data->exported, - 0, XML_LONG_TIME); + XML_LONG_TIME); if (time_string[0]) { writer.writeTextElement("time", time_string); } @@ -1569,15 +1581,8 @@ gpx_write_common_position(const waypoint* waypointp) if (waypointp->altitude != unknown_alt) { writer.writeTextElement("ele", QString::number(waypointp->altitude, 'f', 6)); } - if (waypointp->creation_time) { - char time_string[64]; - // FIXME: Eventually use creation_time.toString() - xml_fill_in_time(time_string, waypointp->creation_time, - waypointp->microseconds, XML_LONG_TIME); - if (time_string[0]) { - writer.writeTextElement("time", time_string); - } - } + QString t = waypointp->CreationTimeXML(); + writer.writeOptionalTextElement("time", t); } static void @@ -1946,7 +1951,7 @@ gpx_write(void) now = current_time(); char time_string[64]; - xml_fill_in_time(time_string, now, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, now, XML_LONG_TIME); if (time_string[0]) { writer.writeTextElement("time", time_string); } diff --git a/gpsbabel/gtm.cc b/gpsbabel/gtm.cc index 46b14b732..830465f3b 100644 --- a/gpsbabel/gtm.cc +++ b/gpsbabel/gtm.cc @@ -740,7 +740,7 @@ static void write_waypt(const waypoint* wpt) fwrite_integer(file_out, icon_from_descr(wpt->icon_descr)); fwrite_byte(file_out, 3); if (wpt->creation_time) { - fwrite_long(file_out, wpt->creation_time-EPOCH89DIFF); + fwrite_long(file_out, wpt->GetCreationTime()-EPOCH89DIFF); } else { fwrite_long(file_out, 0); } @@ -763,7 +763,7 @@ static void write_trk_waypt(const waypoint* wpt) { fwrite_double(file_out, wpt->latitude); fwrite_double(file_out, wpt->longitude); - fwrite_long(file_out, wpt->creation_time-EPOCH89DIFF); + fwrite_long(file_out, wpt->GetCreationTime()-EPOCH89DIFF); fwrite_byte(file_out, start_new); if (wpt->altitude == unknown_alt) { fwrite_single(file_out, unknown_alt_gtm); diff --git a/gpsbabel/gtrnctr.cc b/gpsbabel/gtrnctr.cc index e776aaa6f..57e4d8eda 100644 --- a/gpsbabel/gtrnctr.cc +++ b/gpsbabel/gtrnctr.cc @@ -261,18 +261,18 @@ static void gtc_study_lap(const waypoint* wpt) { if (wpt->creation_time && (gtc_least_time == 0)) { - gtc_least_time = wpt->creation_time; + gtc_least_time = wpt->GetCreationTime(); gtc_start_lat = wpt->latitude; gtc_start_long = wpt->longitude; } - if (wpt->creation_time && (gtc_least_time > wpt->creation_time)) { - gtc_least_time = wpt->creation_time; + if (wpt->creation_time && (gtc_least_time > wpt->GetCreationTime())) { + gtc_least_time = wpt->GetCreationTime(); gtc_start_lat = wpt->latitude; gtc_start_long = wpt->longitude; } if (wpt->creation_time > gtc_most_time) { - gtc_most_time = wpt->creation_time; + gtc_most_time = wpt->GetCreationTime(); gtc_end_lat = wpt->latitude; gtc_end_long = wpt->longitude; } @@ -288,12 +288,10 @@ gtc_waypt_pr(const waypoint* wpt) } if (wpt->creation_time) { - char time_string[100]; - xml_fill_in_time(time_string, wpt->creation_time, wpt->microseconds, - XML_LONG_TIME); - if (time_string[0]) { + QString time_string = wpt->CreationTimeXML(); + if (!time_string.isEmpty()) { gtc_write_xml(0, "\n", - time_string); + qPrintable(time_string)); } } if (wpt->latitude && wpt->longitude) { @@ -394,7 +392,7 @@ gtc_act_hdr(const route_head* rte) route_disp(rte, gtc_study_lap); if (gtc_least_time) { char time_string[100]; - xml_fill_in_time(time_string, gtc_least_time, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, gtc_least_time, XML_LONG_TIME); gtc_write_xml(0, "%s\n", time_string); gtc_write_xml(1, "\n", time_string); } else { diff --git a/gpsbabel/hiketech.cc b/gpsbabel/hiketech.cc index bab21cdc8..019f43664 100644 --- a/gpsbabel/hiketech.cc +++ b/gpsbabel/hiketech.cc @@ -129,7 +129,7 @@ hiketech_trkpt_pr(const waypoint* waypointp) { gbfprintf(ofd, " \n"); if (waypointp->creation_time) { - hiketech_print_utc(waypointp->creation_time, " ", "utc"); + hiketech_print_utc(waypointp->GetCreationTime(), " ", "utc"); } gbfprintf(ofd, " %f\n", waypointp->latitude); gbfprintf(ofd, " %f\n", waypointp->longitude); @@ -259,7 +259,7 @@ void ht_trk_utc(const char* args, const char** unused) utc = mkgmtime(&tm); - wpt_tmp->creation_time = utc; + wpt_tmp->SetCreationTime(utc); } static diff --git a/gpsbabel/holux.cc b/gpsbabel/holux.cc index 3def99f58..96fcf8af1 100644 --- a/gpsbabel/holux.cc +++ b/gpsbabel/holux.cc @@ -120,7 +120,7 @@ static void data_read(void) wpt_tmp->shortname = xstrdup(name); wpt_tmp->description = xstrdup(desc); - wpt_tmp->creation_time = 0; + wpt_tmp->SetCreationTime(0); if (pWptHxTmp->date.year) { #if 0 /* Unless there's some endian swapping that I don't see, @@ -140,7 +140,7 @@ static void data_read(void) tm.tm_mday = pWptHxTmp->date.day; tm.tm_mon = pWptHxTmp->date.month - 1; tm.tm_year = pWptHxTmp->date.year - 1900; - wpt_tmp->creation_time = mktime(&tm); + wpt_tmp->SetCreationTime(mktime(&tm)); } lon = le_read32(&pWptHxTmp->pt.iLongitude) / 36000.0; @@ -227,8 +227,8 @@ static void holux_disp(const waypoint* wpt) /*set the time */ if (wpt->creation_time) { /* tm = gmtime(&wpt->creation_time);*/ /* I get the wrong result with gmtime ??? */ - QDate date(wpt->creation_time.date()); - QTime time(wpt->creation_time.time()); + QDate date(wpt->GetCreationTime().date()); + QTime time(wpt->GetCreationTime().time()); pWptHxTmp->time = (time.hour() * 3600) + (time.minute()* 60) + time.second(); pWptHxTmp->date.day = date.day(); pWptHxTmp->date.month = date.month(); diff --git a/gpsbabel/hsa_ndv.cc b/gpsbabel/hsa_ndv.cc index 11b7bd748..7aef17962 100644 --- a/gpsbabel/hsa_ndv.cc +++ b/gpsbabel/hsa_ndv.cc @@ -129,7 +129,7 @@ hsa_ndv_end(void* data, const XML_Char* xml_el) } else if (strcmp(el, "Longitude") == 0) { wpt_tmp->longitude = atof(cdatastr); } else if (strcmp(el, "Time") == 0) { - wpt_tmp->creation_time = atoi(cdatastr); + wpt_tmp->SetCreationTime(atoi(cdatastr)); } } } diff --git a/gpsbabel/html.cc b/gpsbabel/html.cc index c0764471d..42c6f7c9d 100644 --- a/gpsbabel/html.cc +++ b/gpsbabel/html.cc @@ -81,7 +81,7 @@ html_disp(const waypoint* wpt) { char tbuf[1024]; char* cout; - time_t tm = wpt->creation_time; + time_t tm = wpt->GetCreationTime(); gbint32 utmz; double utme, utmn; char utmzc; diff --git a/gpsbabel/humminbird.cc b/gpsbabel/humminbird.cc index 464b46306..88bc0ae34 100644 --- a/gpsbabel/humminbird.cc +++ b/gpsbabel/humminbird.cc @@ -269,7 +269,7 @@ humminbird_read_wpt(gbfile* fin) wpt = waypt_new(); wpt->shortname = xstrndup(w.name, sizeof(w.name)); - wpt->creation_time = w.time; + wpt->SetCreationTime(w.time); guder = gudermannian_i1924(w.north); wpt->latitude = geocentric_to_geodetic_hwr(guder); @@ -437,7 +437,7 @@ humminbird_read_track(gbfile* fin) /* Unless it's zero. Sometimes happens, possibly if the gps didn't have a lock when the track was saved. */ - wpt->creation_time = th.time; + wpt->SetCreationTime(th.time); } track_add_wpt(trk, wpt); } @@ -554,7 +554,7 @@ humminbird_read_track_old(gbfile* fin) /* Unless it's zero. Sometimes happens, possibly if the gps didn't have a lock when the track was saved. */ - wpt->creation_time = th.time; + wpt->SetCreationTime(th.time); } track_add_wpt(trk, wpt); } @@ -681,7 +681,7 @@ humminbird_write_waypoint(const waypoint* wpt) hum.depth = si_round(WAYPT_GET(wpt, depth, 0)*100.0); be_write16(&hum.depth, hum.depth); - be_write32(&hum.time, wpt->creation_time); + be_write32(&hum.time, wpt->GetCreationTime()); east = wpt->longitude / 180.0 * EAST_SCALE; be_write32(&hum.east, si_round((east))); @@ -782,7 +782,7 @@ humminbird_track_cb(const waypoint* wpt) north = si_round(inverse_gudermannian_i1924(lat)); if (wpt->creation_time != 0) { - last_time = wpt->creation_time; + last_time = wpt->GetCreationTime(); } if (i == 0) { diff --git a/gpsbabel/igc.cc b/gpsbabel/igc.cc index 6357e22de..52375aecf 100644 --- a/gpsbabel/igc.cc +++ b/gpsbabel/igc.cc @@ -206,7 +206,7 @@ static void igc_task_rec(const char* rec) wpt->longitude = ('E' == lon_hemi[0] ? 1 : -1) * (lon_deg + (lon_min * 1000 + lon_frac) / 1000.0 / 60); - wpt->creation_time = creation; + wpt->SetCreationTime(creation); wpt->description = xstrdup(tmp_str); // Name the waypoint according to the order of the task record @@ -364,7 +364,7 @@ static void data_read(void) date += 24 * 60 * 60; } prev_tod = tod; - pres_wpt->creation_time = date + tod; + pres_wpt->SetCreationTime(date + tod); // Add the waypoint to the pressure altitude track if (pres_alt) { @@ -582,7 +582,7 @@ static void wr_header(void) } // Date in header record is that of the first fix record date = !track ? current_time() : - ((waypoint*) QUEUE_FIRST(&track->waypoint_list))->creation_time; + ((waypoint*) QUEUE_FIRST(&track->waypoint_list))->GetCreationTime(); if (NULL == (tm = gmtime(&date))) { fatal(MYNAME ": Bad track timestamp\n"); @@ -648,7 +648,7 @@ static void wr_task_hdr(const route_head* rte) fatal(MYNAME ": Too much waypoints (more than 99) in task route.\n"); } // Gather data to write to the task identification (first) record - rte_time = wpt->creation_time ? wpt->creation_time : current_time(); + rte_time = wpt->GetCreationTime() ? wpt->GetCreationTime() : current_time(); if (NULL == (tm = gmtime(&rte_time))) { fatal(MYNAME ": Bad task route timestamp\n"); } @@ -692,7 +692,7 @@ static void wr_fix_record(const waypoint* wpt, int pres_alt, int gnss_alt) { struct tm* tm; - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = gmtime(&tt); if (NULL == tm) { @@ -742,7 +742,7 @@ static int correlate_tracks(const route_head* pres_track, const route_head* gnss return 0; } } while (alt_diff > -10.0); - pres_time = ((waypoint*) elem->next)->creation_time; + pres_time = ((waypoint*) elem->next)->GetCreationTime(); if (global_opts.debug_level >= 1) { printf(MYNAME ": pressure landing time %s", ctime(&pres_time)); } @@ -758,7 +758,7 @@ static int correlate_tracks(const route_head* pres_track, const route_head* gnss return 0; } // Get a crude indication of groundspeed from the change in lat/lon - time_diff = wpt->creation_time - ((waypoint*) elem)->creation_time; + time_diff = wpt->GetCreationTime() - ((waypoint*) elem)->GetCreationTime(); speed = !time_diff ? 0 : (fabs(wpt->latitude - ((waypoint*) elem)->latitude) + fabs(wpt->longitude - ((waypoint*) elem)->longitude)) / time_diff; @@ -766,7 +766,7 @@ static int correlate_tracks(const route_head* pres_track, const route_head* gnss printf(MYNAME ": speed=%f\n", speed); } } while (speed < 0.00003); - gnss_time = ((waypoint*) elem->next)->creation_time; + gnss_time = ((waypoint*) elem->next)->GetCreationTime(); if (global_opts.debug_level >= 1) { printf(MYNAME ": gnss landing time %s", ctime(&gnss_time)); } @@ -797,7 +797,7 @@ static double interpolate_alt(const route_head* track, time_t time) curr_elem = prev_elem = QUEUE_FIRST(&track->waypoint_list); } // Find the track points either side of the requested time - while (((waypoint*) curr_elem)->creation_time < time) { + while (((waypoint*) curr_elem)->GetCreationTime() < time) { if (QUEUE_LAST(&track->waypoint_list) == curr_elem) { // Requested time later than all track points, we can't interpolate return unknown_alt; @@ -810,7 +810,7 @@ static double interpolate_alt(const route_head* track, time_t time) curr_wpt = (waypoint*) curr_elem; if (QUEUE_FIRST(&track->waypoint_list) == curr_elem) { - if (curr_wpt->creation_time == time) { + if (curr_wpt->GetCreationTime() == time) { // First point's creation time is an exact match so use it's altitude return curr_wpt->altitude; } else { @@ -819,12 +819,12 @@ static double interpolate_alt(const route_head* track, time_t time) } } // Interpolate - if (0 == (time_diff = curr_wpt->creation_time - prev_wpt->creation_time)) { + if (0 == (time_diff = curr_wpt->GetCreationTime() - prev_wpt->GetCreationTime())) { // Avoid divide by zero return curr_wpt->altitude; } alt_diff = curr_wpt->altitude - prev_wpt->altitude; - return prev_wpt->altitude + (alt_diff / time_diff) * (time - prev_wpt->creation_time); + return prev_wpt->altitude + (alt_diff / time_diff) * (time - prev_wpt->GetCreationTime()); } /* @@ -861,7 +861,7 @@ static void wr_track(void) // Iterate through waypoints in both tracks simultaneously QUEUE_FOR_EACH(&gnss_track->waypoint_list, elem, tmp) { wpt = (waypoint*) elem; - pres_alt = interpolate_alt(pres_track, wpt->creation_time + time_adj); + pres_alt = interpolate_alt(pres_track, wpt->GetCreationTime() + time_adj); wr_fix_record(wpt, (int) pres_alt, (int) wpt->altitude); } } else { diff --git a/gpsbabel/igo8.cc b/gpsbabel/igo8.cc index 61c72bbdb..726830bdc 100644 --- a/gpsbabel/igo8.cc +++ b/gpsbabel/igo8.cc @@ -219,7 +219,7 @@ static void write_igo8_track_point(const waypoint* wpt) if (wpt->creation_time == 0) { le_write32(&point.unix_time, invented_time++); } else { - le_write32(&point.unix_time, wpt->creation_time); + le_write32(&point.unix_time, wpt->GetCreationTime()); } // Write the first part of the Information Block, the start time diff --git a/gpsbabel/jtr.cc b/gpsbabel/jtr.cc index 76bd3be09..70f848374 100644 --- a/gpsbabel/jtr.cc +++ b/gpsbabel/jtr.cc @@ -219,8 +219,7 @@ jtr_read(void) wpt->latitude = lat; wpt->longitude = lon; - wpt->creation_time = time; - wpt->microseconds = micros; + wpt->SetCreationTime(time, micros); if (speed >= 0) { WAYPT_SET(wpt, speed, speed); } @@ -275,7 +274,7 @@ jtr_trkpt_disp_cb(const waypoint* wpt) struct tm tm; if (wpt->creation_time > 0) { - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *gmtime(&tt); tm.tm_year += 1900; diff --git a/gpsbabel/kml.cc b/gpsbabel/kml.cc index f61aee3bd..1bd895ec6 100644 --- a/gpsbabel/kml.cc +++ b/gpsbabel/kml.cc @@ -81,8 +81,8 @@ typedef enum { static int realtime_positioning; static bounds kml_bounds; -static time_t kml_time_min; -static time_t kml_time_max; +static gpsbabel::DateTime kml_time_min; +static gpsbabel::DateTime kml_time_max; #define AUTOFORMATTING_OFF(AF) bool AF=writer->autoFormatting(); writer->setAutoFormatting(false); #define AUTOFORMATTING_RESTORE(AF) writer->setAutoFormatting(af); @@ -605,16 +605,13 @@ static void kml_write_bitmap_style(kml_point_type pt_type, const char* bitmap, static void kml_output_timestamp(const waypoint* waypointp) { - if (waypointp->creation_time) { - char time_string[64]; - xml_fill_in_time(time_string, waypointp->creation_time, waypointp->microseconds, XML_LONG_TIME); - if (time_string[0]) { - writer->writeStartElement("TimeStamp"); - AUTOFORMATTING_OFF(af); // FIXME: we turn off autoformatting just to match old writer test references. - writer->writeTextElement("when", time_string); - writer->writeEndElement(); // Close TimeStamp tag - AUTOFORMATTING_RESTORE(af); - } + QString time_string = waypointp->CreationTimeXML(); + if(!time_string.isEmpty()) { + writer->writeStartElement("TimeStamp"); + AUTOFORMATTING_OFF(af); // FIXME: we turn off autoformatting just to match old writer test references. + writer->writeTextElement("when", time_string); + writer->writeEndElement(); // Close TimeStamp tag + AUTOFORMATTING_RESTORE(af); } } @@ -717,9 +714,9 @@ void kml_output_trkdescription(const route_head* header, computed_trkdata* td) if (td->start && td->end) { char time_string[64]; - xml_fill_in_time(time_string, td->start, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, td->start, XML_LONG_TIME); kml_td(hwriter, "Start Time", QString(" %1 ").arg(time_string)); - xml_fill_in_time(time_string, td->end, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, td->end, XML_LONG_TIME); kml_td(hwriter, "End Time", QString(" %1 ").arg(time_string)); } @@ -735,9 +732,9 @@ void kml_output_trkdescription(const route_head* header, computed_trkdata* td) if (td->start && td->end) { char time_string[64]; writer->writeStartElement("TimeSpan"); - xml_fill_in_time(time_string, td->start, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, td->start, XML_LONG_TIME); writer->writeTextElement("begin", time_string); - xml_fill_in_time(time_string, td->end, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, td->end, XML_LONG_TIME); writer->writeTextElement("end", time_string); writer->writeEndElement(); // Close TimeSpan tag } @@ -864,13 +861,10 @@ static void kml_output_description(const waypoint* pt) /* This really shouldn't be here, but as of this writing, * Earth can't edit/display the TimeStamp. */ - if (pt->creation_time) { - char time_string[64]; - - xml_fill_in_time(time_string, pt->creation_time, - pt->microseconds, XML_LONG_TIME); - if (time_string[0]) { - kml_td(hwriter, QString("Time: %1 ").arg(time_string)); + if (pt->GetCreationTime()) { + QString time_string = pt->CreationTimeXML(); + if(!time_string.isEmpty()) { + kml_td(hwriter, QString("Time: %1 ").arg(time_string)); } } @@ -883,13 +877,13 @@ static void kml_output_description(const waypoint* pt) static void kml_recompute_time_bounds(const waypoint* waypointp) { - if (waypointp->creation_time && (waypointp->creation_time < kml_time_min)) { - kml_time_min = waypointp->creation_time; + if (waypointp->GetCreationTime() && (waypointp->GetCreationTime() < kml_time_min)) { + kml_time_min = waypointp->GetCreationTime(); } - if (waypointp->creation_time > kml_time_max) { - kml_time_max = waypointp->creation_time; + if (waypointp->GetCreationTime() > kml_time_max) { + kml_time_max = waypointp->GetCreationTime(); if (kml_time_min == 0) { - kml_time_min = waypointp->creation_time; + kml_time_min = waypointp->GetCreationTime(); } } } @@ -1459,7 +1453,7 @@ static void kml_geocache_pr(const waypoint* waypointp) kml_output_timestamp(waypointp); if (waypointp->creation_time) { strcpy(date_placed, - qPrintable(waypointp->creation_time.toString("dd-MMM-yyyy"))); + qPrintable(waypointp->GetCreationTime().toString("dd-MMM-yyyy"))); } else { date_placed[0] = '\0'; } @@ -1736,13 +1730,9 @@ static void kml_mt_hdr(const route_head* header) QUEUE_FOR_EACH(&header->waypoint_list, elem, tmp) { waypoint* tpt = (waypoint*)elem; - if (tpt->creation_time) { - char time_string[64]; - xml_fill_in_time(time_string, tpt->creation_time, tpt->microseconds, - XML_LONG_TIME); - if (time_string[0]) { - writer->writeTextElement("when", time_string); - } + if (tpt->GetCreationTime()) { + QString time_string = tpt->CreationTimeXML(); + writer->writeOptionalTextElement("when", time_string); } else { writer->writeStartElement("when"); writer->writeEndElement(); // Close when tag @@ -1862,7 +1852,7 @@ void kml_write_AbstractView(void) writer->writeStartElement("gx:TimeSpan"); if (kml_time_min) { char time_string[64]; - xml_fill_in_time(time_string, kml_time_min, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, kml_time_min, XML_LONG_TIME); if (time_string[0]) { writer->writeTextElement("begin", time_string); } @@ -1878,7 +1868,7 @@ void kml_write_AbstractView(void) // ensure the right edge of that time slider includes us. // time_max = realtime_positioning ? kml_time_max + 600 : kml_time_max; - xml_fill_in_time(time_string, time_max, 0, XML_LONG_TIME); + xml_fill_in_time(time_string, time_max, XML_LONG_TIME); if (time_string[0]) { writer->writeTextElement("end", time_string); } @@ -2104,7 +2094,7 @@ static route_head* posn_trk_head = NULL; static void kml_wr_position(waypoint* wpt) { - static time_t last_valid_fix; + static gpsbabel::DateTime last_valid_fix; kml_wr_init(posnfilenametmp); @@ -2136,10 +2126,10 @@ kml_wr_position(waypoint* wpt) case fix_unknown: break; default: - last_valid_fix = wpt->creation_time; + last_valid_fix = wpt->GetCreationTime(); } - wpt->icon_descr = kml_get_posn_icon(wpt->creation_time - last_valid_fix); + wpt->icon_descr = kml_get_posn_icon(wpt->GetCreationTime() - last_valid_fix); /* In order to avoid clutter while we're sitting still, don't add diff --git a/gpsbabel/magproto.cc b/gpsbabel/magproto.cc index 7b56c3b5c..984922bb9 100644 --- a/gpsbabel/magproto.cc +++ b/gpsbabel/magproto.cc @@ -993,8 +993,7 @@ mag_trkparse(char* trkmsg) dmy = dmy / 100; tm.tm_mday = dmy % 100; - waypt->creation_time = mkgmtime(&tm); - waypt->microseconds = CENTI_TO_MICRO(fracsecs); + waypt->SetCreationTime(mkgmtime(&tm), CENTI_TO_MICRO(fracsecs)); if (latdir == 'S') { latdeg = -latdeg; @@ -1443,7 +1442,7 @@ void mag_track_disp(const waypoint* waypointp) ilon = waypointp->longitude; tm = NULL; if (waypointp->creation_time) { - const time_t ct = waypointp->creation_time; + const time_t ct = waypointp->GetCreationTime(); tm = gmtime(&ct); if (tm) { hms = tm->tm_hour * 10000 + tm->tm_min * 100 + diff --git a/gpsbabel/mapsend.cc b/gpsbabel/mapsend.cc index 31d18d7d9..8ae4e2e03 100644 --- a/gpsbabel/mapsend.cc +++ b/gpsbabel/mapsend.cc @@ -233,7 +233,8 @@ static void mapsend_read(void) { mapsend_hdr hdr; - int type, len; + int type; + gbsize_t len; char buf[3]; /* @@ -471,7 +472,7 @@ void mapsend_track_hdr(const route_head* trk) void mapsend_track_disp(const waypoint* wpt) { unsigned char c; - int t; + gbint32 t; static int last_time; /* @@ -484,7 +485,7 @@ void mapsend_track_disp(const waypoint* wpt) * * This is rumoured (but yet unconfirmed) to be fixed in f/w 5.12. */ - t = wpt->creation_time; + t = wpt->GetCreationTime(); if (t < last_time) { t = last_time; } diff --git a/gpsbabel/mapsource.cc b/gpsbabel/mapsource.cc index 690bf342d..3d10c591a 100644 --- a/gpsbabel/mapsource.cc +++ b/gpsbabel/mapsource.cc @@ -1148,7 +1148,7 @@ mps_routehdr_w(gbfile* mps_file, int mps_ver, const route_head* rte) QUEUE_FOR_EACH(&rte->waypoint_list, elem, tmp) { testwpt = (waypoint*)elem; if (rte_datapoints == 0) { - uniqueValue = testwpt->creation_time; + uniqueValue = testwpt->GetCreationTime(); } if (testwpt->latitude > maxlat) { maxlat = testwpt->latitude; @@ -1544,8 +1544,7 @@ mps_track_r(gbfile* mps_file, int mps_ver, route_head** trk) thisWaypoint = waypt_new(); thisWaypoint->latitude = GPS_Math_Semi_To_Deg(lat); thisWaypoint->longitude = GPS_Math_Semi_To_Deg(lon); - thisWaypoint->creation_time = dateTime; - thisWaypoint->microseconds = 0; + thisWaypoint->SetCreationTime(dateTime); thisWaypoint->altitude = mps_altitude; if (mps_depth != unknown_alt) { WAYPT_SET(thisWaypoint, depth, mps_depth); @@ -1582,7 +1581,7 @@ mps_trackhdr_w(gbfile* mps_file, int mps_ver, const route_head* trk) QUEUE_FOR_EACH(&trk->waypoint_list, elem, tmp) { if (trk_datapoints == 0) { testwpt = (waypoint*)elem; - uniqueValue = testwpt->creation_time; + uniqueValue = testwpt->GetCreationTime(); } trk_datapoints++; } @@ -1637,7 +1636,7 @@ static void mps_trackdatapoint_w(gbfile* mps_file, int mps_ver, const waypoint* wpt) { int lat, lon; - time_t t = wpt->creation_time; + time_t t = wpt->GetCreationTime(); char zbuf[10]; double mps_altitude = wpt->altitude; diff --git a/gpsbabel/mmo.cc b/gpsbabel/mmo.cc index 761938f8e..cf91d906e 100644 --- a/gpsbabel/mmo.cc +++ b/gpsbabel/mmo.cc @@ -491,7 +491,7 @@ mmo_read_CObjWaypoint(mmo_data_t* data) time = data->ctime; } if (time > 0) { - wpt->creation_time = time; + wpt->SetCreationTime(time); } if (mmo_version >= 0x18) { @@ -726,7 +726,7 @@ mmo_read_CObjTrack(mmo_data_t* data) unk = gbfgetc(fin); DBG((sobj, "Unknown = 0x%02X (%d)\n", unk, unk)); - wpt->creation_time = gbfgetint32(fin); + wpt->SetCreationTime(gbfgetint32(fin)); wpt->altitude = gbfgetflt(fin); if (unk != 0) { diff --git a/gpsbabel/mtk_locus.cc b/gpsbabel/mtk_locus.cc index 15efd00f1..e977538a2 100644 --- a/gpsbabel/mtk_locus.cc +++ b/gpsbabel/mtk_locus.cc @@ -437,8 +437,7 @@ process_pmtklox() if (global_opts.masked_objective & TRKDATAMASK) { trkpt = waypt_new(); - trkpt->creation_time = timestamp; - trkpt->microseconds = 0; + trkpt->SetCreationTime(timestamp); trkpt->latitude = latitude; trkpt->longitude = longitude; trkpt->altitude = height; @@ -450,8 +449,7 @@ process_pmtklox() if (global_opts.masked_objective & WPTDATAMASK) { waypt = waypt_new(); - waypt->creation_time = timestamp; - waypt->microseconds = 0; + waypt->SetCreationTime(timestamp); waypt->latitude = latitude; waypt->longitude = longitude; waypt->altitude = height; diff --git a/gpsbabel/navicache.cc b/gpsbabel/navicache.cc index 848f999d7..f530b5678 100644 --- a/gpsbabel/navicache.cc +++ b/gpsbabel/navicache.cc @@ -177,7 +177,7 @@ nav_start(void* data, const XML_Char* xml_el, const XML_Char** xml_attr) tm.tm_hour = 0; tm.tm_min = 0; tm.tm_sec = 0; - wpt_tmp->creation_time = mktime(&tm); + wpt_tmp->SetCreationTime(mktime(&tm)); } else if (0 == strcmp(ap[0], "retired")) { if (!strcmp(ap[1], "yes") && noretired) { xfree(wpt_tmp); diff --git a/gpsbabel/navilink.cc b/gpsbabel/navilink.cc index a2d1bdc6f..562cd18ed 100644 --- a/gpsbabel/navilink.cc +++ b/gpsbabel/navilink.cc @@ -415,7 +415,7 @@ decode_waypoint(const unsigned char* buffer) decode_position(buffer + 12, waypt); waypt->shortname = xstrdup((char*)buffer + 4); waypt->icon_descr = icon_table[buffer[28]]; - waypt->creation_time = decode_datetime(buffer + 22); + waypt->SetCreationTime(decode_datetime(buffer + 22)); return waypt; } @@ -430,7 +430,7 @@ encode_waypoint(const waypoint* waypt, unsigned char* buffer) buffer[10] = 0; buffer[11] = 0; encode_position(waypt, buffer + 12); - encode_datetime(waypt->creation_time, buffer + 22); + encode_datetime(waypt->GetCreationTime(), buffer + 22); buffer[28] = find_icon_from_descr(waypt->icon_descr); buffer[29] = 0; buffer[30] = 0x00; @@ -443,7 +443,7 @@ decode_trackpoint(const unsigned char* buffer) waypoint* waypt = waypt_new(); decode_position(buffer + 12, waypt); - waypt->creation_time = decode_datetime(buffer + 22); + waypt->SetCreationTime(decode_datetime(buffer + 22)); WAYPT_SET(waypt, course, le_read16(buffer + 2)); WAYPT_SET(waypt, speed, KPH_TO_MPS(buffer[29] * 2)); @@ -465,7 +465,7 @@ encode_trackpoint(const waypoint* waypt, unsigned serial, unsigned char* buffer) le_write32(buffer + 4, x); le_write32(buffer + 8, y); encode_position(waypt, buffer + 12); - encode_datetime(waypt->creation_time, buffer + 22); + encode_datetime(waypt->GetCreationTime(), buffer + 22); buffer[28] = z; buffer[29] = MPS_TO_KPH(WAYPT_GET(waypt, speed, 0) / 2); buffer[30] = 0x5a; @@ -852,7 +852,7 @@ navilink_decode_logpoint(const unsigned char* buffer) waypt->hdop = ((unsigned char)buffer[0]) * 0.2f; waypt->sat = buffer[1]; waypt->microseconds = decode_sbp_usec(buffer + 2); - waypt->creation_time = decode_sbp_datetime_packed(buffer + 4); + waypt->SetCreationTime(decode_sbp_datetime_packed(buffer + 4)); decode_sbp_position(buffer + 12, waypt); WAYPT_SET(waypt, speed, le_read16(buffer + 24) * 0.01f); WAYPT_SET(waypt, course, le_read16(buffer + 26) * 0.01f); diff --git a/gpsbabel/nmea.cc b/gpsbabel/nmea.cc index 1584f4bd7..f939bbf42 100644 --- a/gpsbabel/nmea.cc +++ b/gpsbabel/nmea.cc @@ -899,7 +899,7 @@ nmea_fix_timestamps(route_head* track) wpt->creation_time+=SECONDS_PER_DAY; } } - prev = wpt->creation_time; + prev = wpt->GetCreationTime(); } } } @@ -1261,19 +1261,19 @@ nmea_trackpt_pr(const waypoint* wpt) if (sleepus >= 0) { gb_sleep(sleepus); } else { - long wait_time = wpt->creation_time - last_time; + long wait_time = wpt->GetCreationTime() - last_time; if (wait_time > 0) { gb_sleep(wait_time * 1000000); } } } - last_time = wpt->creation_time; + last_time = wpt->GetCreationTime(); } lat = degrees2ddmm(wpt->latitude); lon = degrees2ddmm(wpt->longitude); - time_t ct = wpt->creation_time; + time_t ct = wpt->GetCreationTime(); tm = gmtime(&ct); if (tm) { hms = tm->tm_hour * 10000 + tm->tm_min * 100 + tm->tm_sec; diff --git a/gpsbabel/osm.cc b/gpsbabel/osm.cc index 345dd01d1..ea14f9977 100644 --- a/gpsbabel/osm.cc +++ b/gpsbabel/osm.cc @@ -802,9 +802,8 @@ osm_waypt_disp(const waypoint* wpt) gbfprintf(fout, " latitude, wpt->longitude); if (wpt->creation_time) { - char time_string[64]; - xml_fill_in_time(time_string, wpt->creation_time, wpt->microseconds, XML_LONG_TIME); - gbfprintf(fout, " timestamp='%s'", time_string); + QString time_string = wpt->CreationTimeXML(); + gbfprintf(fout, " timestamp='%s'", qPrintable(time_string)); } gbfprintf(fout, ">\n"); diff --git a/gpsbabel/ozi.cc b/gpsbabel/ozi.cc index dd2304be6..3c39c6b61 100644 --- a/gpsbabel/ozi.cc +++ b/gpsbabel/ozi.cc @@ -166,7 +166,7 @@ ozi_set_time_str(const char *str, waypoint *waypointp) int len; ozi_time = atof(str); - waypointp->creation_time = (ozi_time - DAYS_SINCE_1990) * SECONDS_PER_DAY; + waypointp->SetCreationTime((ozi_time - DAYS_SINCE_1990) * SECONDS_PER_DAY); dot = strchr(str, '.'); /* get number of characters after dot */ diff --git a/gpsbabel/palmdoc.cc b/gpsbabel/palmdoc.cc index 8e3d656cd..6cb77fb94 100644 --- a/gpsbabel/palmdoc.cc +++ b/gpsbabel/palmdoc.cc @@ -405,7 +405,7 @@ palmdoc_disp(const waypoint *wpt) { int latint, lonint; char tbuf[1024]; - time_t tm = wpt->creation_time; + time_t tm = wpt->GetCreationTime(); int32 utmz; double utme, utmn; char utmzc; diff --git a/gpsbabel/pathaway.cc b/gpsbabel/pathaway.cc index 914b75d6f..542816071 100644 --- a/gpsbabel/pathaway.cc +++ b/gpsbabel/pathaway.cc @@ -691,7 +691,7 @@ static void ppdb_write_wpt(const waypoint *wpt) if (wpt->creation_time != 0) { tmp = str_pool_get(20); - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *gmtime(&tt); strftime(tmp, 20, datefmt, &tm); buff = ppdb_strcat(buff, tmp, NULL, &len); diff --git a/gpsbabel/pcx.cc b/gpsbabel/pcx.cc index 979f21d8c..b4a463d4b 100644 --- a/gpsbabel/pcx.cc +++ b/gpsbabel/pcx.cc @@ -254,7 +254,7 @@ data_read(void) tm.tm_year += 100; } wpt_tmp = waypt_new(); - wpt_tmp->creation_time = mkgmtime(&tm); + wpt_tmp->SetCreationTime(mkgmtime(&tm)); if (read_as_degrees) { wpt_tmp->longitude = lon; wpt_tmp->latitude = lat; @@ -321,7 +321,7 @@ gpsutil_disp(const waypoint *wpt) double lon,lat; int icon_token = 0; char tbuf[1024]; - time_t tm = wpt->creation_time; + time_t tm = wpt->GetCreationTime(); lon = degrees2ddmm(wpt->longitude); lat = degrees2ddmm(wpt->latitude); @@ -407,7 +407,7 @@ pcx_track_disp(const waypoint *wpt) lon = degrees2ddmm(wpt->longitude); lat = degrees2ddmm(wpt->latitude); - const time_t ct = wpt->creation_time; + const time_t ct = wpt->GetCreationTime(); tm = gmtime(&ct); strftime(tbuf, sizeof(tbuf), "%d-%b-%y %H:%M:%S", tm); /* currently ...%T does nothing under Windows */ diff --git a/gpsbabel/pocketfms_bc.cc b/gpsbabel/pocketfms_bc.cc index 76336ce78..652193b9c 100644 --- a/gpsbabel/pocketfms_bc.cc +++ b/gpsbabel/pocketfms_bc.cc @@ -108,7 +108,7 @@ read_tracks(void) wpt->latitude = le_read_float(&bc.latitude); wpt->longitude = le_read_float(&bc.longitude); wpt->altitude = FEET_TO_METERS(le_read_float(&bc.altitude)); - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); wpt->hdop = le_read_float(&bc.ehpe); wpt->vdop = le_read_float(&bc.evpe); wpt->pdop = le_read_float(&bc.espe); @@ -132,10 +132,10 @@ pocketfms_waypt_disp(const waypoint *wpt) struct tm *tm; memset(&bc, 0, sizeof(bc)); - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = localtime(&tt); if (wpt->creation_time) { - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = gmtime(&tt); } diff --git a/gpsbabel/psitrex.cc b/gpsbabel/psitrex.cc index ed119acb8..5fed711a3 100644 --- a/gpsbabel/psitrex.cc +++ b/gpsbabel/psitrex.cc @@ -488,7 +488,7 @@ psit_routehdr_w(gbfile *psit_file, const route_head *rte) QUEUE_FOR_EACH(&rte->waypoint_list, elem, tmp) { testwpt = (waypoint *)elem; if (rte_datapoints == 0) { - uniqueValue = testwpt->creation_time; + uniqueValue = testwpt->GetCreationTime(); } rte_datapoints++; } @@ -597,8 +597,9 @@ psit_track_r(gbfile *psit_file, route_head **trk) if ((strcmp(psit_current_token, "1") == 0) || (track_head == NULL)) { track_head = route_head_alloc(); - /* Add a number to the track name. With Garmins, the "first" tracklog is usually ACTIVE LOG - the second is ACTIVE LOG001 and so on */ + /* Add a number to the track name. With Garmins, the "first" + tracklog is usually ACTIVE LOG + the second is ACTIVE LOG001 and so on */ if (trk_num > 0) { sprintf(tbuf, "%s%03d", trkname, trk_num); track_head->rte_name = xstrdup(tbuf); @@ -608,14 +609,14 @@ psit_track_r(gbfile *psit_file, route_head **trk) trk_num++; track_add_head(track_head); } - - thisWaypoint->creation_time = dateTime; + + thisWaypoint->SetCreationTime(dateTime); track_add_wpt(track_head, thisWaypoint); - + if (gbfeof(psit_file)) { break; } - + psit_getToken(psit_file,psit_current_token,sizeof(psit_current_token), wscomma); } else { break; @@ -647,7 +648,7 @@ psit_trackhdr_w(gbfile *psit_file, const route_head *trk) QUEUE_FOR_EACH(&trk->waypoint_list, elem, tmp) { if (trk_datapoints == 0) { testwpt = (waypoint *)elem; - uniqueValue = testwpt->creation_time; + uniqueValue = testwpt->GetCreationTime(); } trk_datapoints++; } @@ -691,7 +692,7 @@ psit_trackhdr_w_wrapper(const route_head *trk) static void psit_trackdatapoint_w(gbfile *psit_file, const waypoint *wpt) { - time_t t = wpt->creation_time; + time_t t = wpt->GetCreationTime(); struct tm *tmTime = gmtime(&t); gbfprintf(psit_file, "%11.6f,%11.6f,", @@ -808,7 +809,8 @@ psit_write(void) route_disp_all(psit_routehdr_w_wrapper, psit_noop, psit_waypoint_w_wrapper); } if (global_opts.objective == trkdata) { - track_disp_all(psit_trackhdr_w_wrapper, psit_noop, psit_trackdatapoint_w_wrapper); + track_disp_all(psit_trackhdr_w_wrapper, + psit_noop, psit_trackdatapoint_w_wrapper); } mkshort_del_handle(&mkshort_handle); diff --git a/gpsbabel/raymarine.cc b/gpsbabel/raymarine.cc index 8d08f5339..830397679 100644 --- a/gpsbabel/raymarine.cc +++ b/gpsbabel/raymarine.cc @@ -218,7 +218,7 @@ raymarine_read(void) wpt->notes = xstrdup(str); } if (((str = inifile_readstr(fin, sect, "Time"))) && *str) { - wpt->creation_time = EXCEL_TO_TIMET(atof(str)); + wpt->SetCreationTime(EXCEL_TO_TIMET(atof(str))); } if (((str = inifile_readstr(fin, sect, "Bmp"))) && *str) { unsigned int symbol = atoi(str); @@ -349,7 +349,7 @@ write_waypoint(gbfile *fout, const waypoint *wpt, const int waypt_no, const char } } notes = csv_stringclean(notes, LINE_FEED); - time = (wpt->creation_time > 0) ? TIMET_TO_EXCEL(wpt->creation_time) : TIMET_TO_EXCEL(gpsbabel_time); + time = (wpt->creation_time > 0) ? TIMET_TO_EXCEL(wpt->GetCreationTime()) : TIMET_TO_EXCEL(gpsbabel_time); name = (char *)wpt->extra_data; gbfprintf(fout, "[Wp%d]" LINE_FEED diff --git a/gpsbabel/route.cc b/gpsbabel/route.cc index 8761413a5..607f74c3c 100644 --- a/gpsbabel/route.cc +++ b/gpsbabel/route.cc @@ -582,7 +582,7 @@ void track_recompute(const route_head *trk, computed_trkdata **trkdatap) double tlat, tlon, plat, plon, dist; thisw = (waypoint *)elem; - timed = thisw->creation_time - prev->creation_time; + timed = thisw->GetCreationTime() - prev->GetCreationTime(); /* * gcdist and heading want radians, not degrees. @@ -651,12 +651,12 @@ void track_recompute(const route_head *trk, computed_trkdata **trkdatap) tdata->max_cad = (int) thisw->cadence; } - if (thisw->creation_time && (thisw->creation_time < tdata->start)) { - tdata->start = thisw->creation_time; + if (thisw->GetCreationTime() && (thisw->GetCreationTime() < tdata->start)) { + tdata->start = thisw->GetCreationTime(); } if (thisw->creation_time > tdata->end) { - tdata->end = thisw->creation_time; + tdata->end = thisw->GetCreationTime(); if (tdata->start == 0) { tdata->start = tdata->end; } diff --git a/gpsbabel/saroute.cc b/gpsbabel/saroute.cc index f8e6205e8..3b01f4571 100644 --- a/gpsbabel/saroute.cc +++ b/gpsbabel/saroute.cc @@ -381,12 +381,11 @@ my_read(void) if (totaldist > seglen) { totaldist = seglen; } - wpt_tmp->creation_time = + wpt_tmp->SetCreationTime( gpsbabel_time+starttime+ - transittime * totaldist/seglen; + transittime * totaldist/seglen); } else { - wpt_tmp->creation_time = - gpsbabel_time+starttime; + wpt_tmp->SetCreationTime(gpsbabel_time+starttime); totaldist = 0; } oldlat = lat; diff --git a/gpsbabel/sbn.cc b/gpsbabel/sbn.cc index ffd5c0319..7d57a21c2 100644 --- a/gpsbabel/sbn.cc +++ b/gpsbabel/sbn.cc @@ -225,7 +225,7 @@ decode_sbn_datetime(const unsigned char *buffer, waypoint *waypt) tm.tm_mon = buffer[2] - 1; tm.tm_year = be_readu16(buffer) - 1900; - waypt->creation_time = mkgmtime(&tm); + waypt->SetCreationTime(mkgmtime(&tm)); waypt->microseconds = (ms % 1000) * 1000; } diff --git a/gpsbabel/skyforce.cc b/gpsbabel/skyforce.cc index 105886148..a78332233 100644 --- a/gpsbabel/skyforce.cc +++ b/gpsbabel/skyforce.cc @@ -113,7 +113,7 @@ skyforce_parse_trk(const char *str) fatal(MYNAME ": Could not parse date string (%s - %s).\n", buf, cx); } - wpt->creation_time = mkgmtime(&tm); + wpt->SetCreationTime(mkgmtime(&tm)); len = strlen(str); @@ -177,7 +177,7 @@ skyforce_waypt_disp_cb(const waypoint *wpt) if (global_opts.objective == trkdata) { struct tm tm; - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *gmtime(&tt); strftime(buf + 2, sizeof(buf) - 2, "%d%m%y %H%M%S ", &tm); } else { diff --git a/gpsbabel/skytraq.cc b/gpsbabel/skytraq.cc index 9b6a71579..f9ed3e480 100644 --- a/gpsbabel/skytraq.cc +++ b/gpsbabel/skytraq.cc @@ -663,7 +663,7 @@ make_trackpoint(struct read_state *st, double lat, double lon, double alt) wpt->latitude = lat; wpt->longitude = lon; wpt->altitude = alt; - wpt->creation_time = gpstime_to_timet(st->gps_week, st->gps_sec); + wpt->SetCreationTime(gpstime_to_timet(st->gps_week, st->gps_sec)); return wpt; } diff --git a/gpsbabel/smplrout.cc b/gpsbabel/smplrout.cc index 137e5e76a..e0d49cd6f 100644 --- a/gpsbabel/smplrout.cc +++ b/gpsbabel/smplrout.cc @@ -186,9 +186,9 @@ compute_xte(struct xte *xte_rec) fatal(MYNAME ": relative needs hdop information.\n"); } // if timestamps exist, distance to interpolated point - if (wpt1->creation_time != wpt2->creation_time) { + if (wpt1->GetCreationTime() != wpt2->GetCreationTime()) { frac = (double)(wpt3->creation_time - wpt1->creation_time) / - (wpt2->creation_time - wpt1->creation_time); + (wpt2->GetCreationTime() - wpt1->GetCreationTime()); linepart(wpt1->latitude, wpt1->longitude, wpt2->latitude, wpt2->longitude, frac, &reslat, &reslon); diff --git a/gpsbabel/sort.cc b/gpsbabel/sort.cc index b3c526340..d13c67da7 100644 --- a/gpsbabel/sort.cc +++ b/gpsbabel/sort.cc @@ -70,7 +70,7 @@ sort_comp(const queue * a, const queue * b) case sm_description: return strcmp(x1->description, x2->description); case sm_time: - return x1->creation_time - x2->creation_time; + return x1->GetCreationTime() - x2->GetCreationTime(); default: abort(); return 0; /* Internal caller error. */ diff --git a/gpsbabel/src/core/datetime.h b/gpsbabel/src/core/datetime.h index 0270ba819..4456d18d4 100644 --- a/gpsbabel/src/core/datetime.h +++ b/gpsbabel/src/core/datetime.h @@ -85,6 +85,9 @@ public: void addUSecs(qint64 usecs) const { this->addMSecs(usecs / 1000); } + int usec() const { + return this->time().msec() * 1000; + } // Integer form: YYMMDD int ymd() const { diff --git a/gpsbabel/stmsdf.cc b/gpsbabel/stmsdf.cc index b2e548d5e..6534565bb 100644 --- a/gpsbabel/stmsdf.cc +++ b/gpsbabel/stmsdf.cc @@ -169,7 +169,7 @@ track_qsort_cb(const void *a, const void *b) const waypoint *wa = *(waypoint **)a; const waypoint *wb = *(waypoint **)b; - return wa->creation_time - wb->creation_time; + return wa->GetCreationTime() - wb->GetCreationTime(); } static void @@ -330,7 +330,7 @@ parse_point(char *line) tm.tm_min = min; tm.tm_sec = sec; - wpt->creation_time = mklocaltime(&tm); + wpt->SetCreationTime(mklocaltime(&tm)); } if (datum != DATUM_WGS84) { @@ -455,7 +455,7 @@ calculate(const waypoint *wpt, double *dist, double *speed, double *course, *dist = 0; /* calc. diffs on 32- and 64-bit hosts */ } - time = wpt->creation_time - trkpt_out->creation_time; + time = wpt->creation_time - trkpt_out->GetCreationTime(); if (time == 0) { *speed = 0; } else { @@ -526,7 +526,7 @@ any_waypt_calc_cb(const waypoint *wpt) } if ((all_points == 0) && (this_points == 0)) { - start_time = wpt->creation_time; + start_time = wpt->GetCreationTime(); } this_points++; @@ -544,7 +544,7 @@ any_waypt_calc_cb(const waypoint *wpt) this_distance = this_distance + dist; if (trkpt_out != NULL) { - this_time += (wpt->creation_time - trkpt_out->creation_time); + this_time += (wpt->GetCreationTime() - trkpt_out->GetCreationTime()); } trkpt_out = (waypoint *)wpt; @@ -585,7 +585,7 @@ track_disp_wpt_cb(const waypoint *wpt) track_points++; all_track_points++; - time_t ct = wpt->creation_time; + time_t ct = wpt->GetCreationTime(); tm = *localtime(&ct); strftime(tbuf, sizeof(tbuf), "%d.%m.%Y,%H:%M.%S", &tm); @@ -669,8 +669,8 @@ route_disp_wpt_cb(const waypoint *wpt) static void track_disp_custom_cb(const waypoint *wpt) { - if (wpt->creation_time && (wpt->altitude != unknown_alt)) { - gbfprintf(fout, "%d,%.f\n", (int)(wpt->creation_time - start_time), wpt->altitude); + if (wpt->GetCreationTime() && (wpt->altitude != unknown_alt)) { + gbfprintf(fout, "%d,%.f\n", (int)(wpt->GetCreationTime() - start_time), wpt->altitude); } } diff --git a/gpsbabel/stmwpp.cc b/gpsbabel/stmwpp.cc index d50b9a6cf..8d627352d 100644 --- a/gpsbabel/stmwpp.cc +++ b/gpsbabel/stmwpp.cc @@ -166,7 +166,7 @@ stmwpp_data_read(void) if (wpt != NULL) { time.tm_year -= 1900; time.tm_mon--; - wpt->creation_time = mkgmtime(&time); + wpt->SetCreationTime(mkgmtime(&time)); switch (what) { case STM_WAYPT: @@ -239,7 +239,7 @@ stmwpp_waypt_cb(const waypoint *wpt) return; } - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *gmtime(&tt); tm.tm_year += 1900; tm.tm_mon++; diff --git a/gpsbabel/subrip.cc b/gpsbabel/subrip.cc index 40f2c83ff..dd48e2caf 100644 --- a/gpsbabel/subrip.cc +++ b/gpsbabel/subrip.cc @@ -92,17 +92,17 @@ subrip_prevwp_pr(const waypoint *waypointp) time_t starttime; time_t endtime; - if (prevwpp->creation_time >= time_offset) + if (prevwpp->GetCreationTime() >= time_offset) /* if this condition is not true, the waypoint is before the beginning of * the video and will be ignored */ { - starttime = gps_to_video_time(prevwpp->creation_time); + starttime = gps_to_video_time(prevwpp->GetCreationTime()); if (!waypointp) { endtime = starttime + 1; } else { - endtime = gps_to_video_time(waypointp->creation_time); + endtime = gps_to_video_time(waypointp->GetCreationTime()); } gbfprintf(fout, "%d\n", stnum); stnum++; @@ -120,7 +120,7 @@ subrip_prevwp_pr(const waypoint *waypointp) } else if WAYPT_HAS(prevwpp, speed) { gbfprintf(fout, "\n"); } - subrip_write_time(prevwpp->creation_time); + subrip_write_time(prevwpp->GetCreationTime()); gbfprintf(fout, " Lat=%0.5lf Lon=%0.5lf\n", prevwpp->latitude + .000005, prevwpp->longitude + .000005); @@ -148,7 +148,7 @@ subrip_trkpt_pr(const waypoint *waypointp) * way of solving this should be trivial to you :-) */ { - time_offset = sync_time(waypointp->creation_time, opt_videotime); + time_offset = sync_time(waypointp->GetCreationTime(), opt_videotime); } if (prevwpp) { diff --git a/gpsbabel/text.cc b/gpsbabel/text.cc index ef2cd59c1..5eb127a9a 100644 --- a/gpsbabel/text.cc +++ b/gpsbabel/text.cc @@ -97,7 +97,7 @@ text_disp(const waypoint *wpt) { int latint, lonint; char tbuf[1024]; - time_t tm = wpt->creation_time; + time_t tm = wpt->GetCreationTime(); gbint32 utmz; double utme, utmn; char utmzc; diff --git a/gpsbabel/tiger.cc b/gpsbabel/tiger.cc index 8749c1ffe..b39c836cd 100644 --- a/gpsbabel/tiger.cc +++ b/gpsbabel/tiger.cc @@ -189,7 +189,7 @@ tiger_disp(const waypoint *wpt) pin = wpt->icon_descr; } else if (wpt->icon_descr.contains("-unfound")) { pin = unfoundmarker; - } else if (wpt->creation_time > current_time() - 3600 * 24 * thresh_days) { + } else if (wpt->GetCreationTime() > current_time() - 3600 * 24 * thresh_days) { pin = newmarker; } else { pin = oldmarker; diff --git a/gpsbabel/trackfilter.cc b/gpsbabel/trackfilter.cc index 5bcdfcc01..f8c0a01c6 100644 --- a/gpsbabel/trackfilter.cc +++ b/gpsbabel/trackfilter.cc @@ -269,7 +269,7 @@ trackfilter_merge_qsort_cb(const void *a, const void *b) const waypoint *wa = *(waypoint **)a; const waypoint *wb = *(waypoint **)b; - return wa->creation_time - wb->creation_time; + return wa->GetCreationTime() - wb->GetCreationTime(); } static fix_type @@ -344,17 +344,16 @@ trackfilter_fill_track_list_cb(const route_head *track) /* callback for track_d i++; if (i == 1) { - track_list[track_ct].first_time = wpt->creation_time; + track_list[track_ct].first_time = wpt->GetCreationTime(); } else if (i == track->rte_waypt_ct) { - track_list[track_ct].last_time = wpt->creation_time; + track_list[track_ct].last_time = wpt->GetCreationTime(); } - if ((need_time != 0) && (prev != NULL) && (prev->creation_time > wpt->creation_time)) { + if ((need_time != 0) && (prev != NULL) && (prev->GetCreationTime() > wpt->GetCreationTime())) { if (opt_merge == NULL) { - char t1[64], t2[64]; - xml_fill_in_time(t1, prev->creation_time, 0, XML_LONG_TIME); - xml_fill_in_time(t2, wpt->creation_time, 0, XML_LONG_TIME); - fatal(MYNAME "-init: Track points badly ordered (timestamp %s > %s)!\n", t1, t2); + QString t1 = prev->CreationTimeXML(); + QString t2 = wpt->CreationTimeXML(); + fatal(MYNAME "-init: Track points badly ordered (timestamp %s > %s)!\n", qPrintable(t1), qPrintable(t2)); } } prev = wpt; @@ -525,7 +524,7 @@ trackfilter_merge(void) for (i = 0; i < track_pts-timeless_pts; i++) { wpt = buff[i]; - if ((prev == NULL) || (prev->creation_time != wpt->creation_time)) { + if ((prev == NULL) || (prev->GetCreationTime() != wpt->GetCreationTime())) { route_add_wpt(master, wpt); prev = wpt; } else { @@ -708,7 +707,7 @@ trackfilter_split(void) } if (interval > 0) { - double tr_interval = difftime(buff[j]->creation_time,buff[i]->creation_time); + double tr_interval = difftime(buff[j]->GetCreationTime(),buff[i]->GetCreationTime()); if (tr_interval <= interval) { new_track_flag = 0; } @@ -725,7 +724,7 @@ trackfilter_split(void) printf(MYNAME ": splitting new track\n"); #endif curr = (route_head *) route_head_alloc(); - trackfilter_split_init_rte_name(curr, buff[j]->creation_time); + trackfilter_split_init_rte_name(curr, buff[j]->GetCreationTime()); track_add_head(curr); } if (curr != NULL) { @@ -812,12 +811,12 @@ trackfilter_synth(void) RAD(wpt->longitude))); } if (opt_speed) { - if (oldtime != wpt->creation_time) { + if (oldtime != wpt->GetCreationTime()) { WAYPT_SET(wpt, speed, radtometers(gcdist( RAD(oldlat), RAD(oldlon), RAD(wpt->latitude), RAD(wpt->longitude))) / - labs(wpt->creation_time-oldtime)); + labs(wpt->GetCreationTime()-oldtime)); } else { WAYPT_UNSET(wpt, speed); } @@ -825,7 +824,7 @@ trackfilter_synth(void) } oldlat = wpt->latitude; oldlon = wpt->longitude; - oldtime = wpt->creation_time; + oldtime = wpt->GetCreationTime(); } } } @@ -893,7 +892,7 @@ trackfilter_range(void) /* returns number of track points left after filtering QUEUE_FOR_EACH((queue *)&track->waypoint_list, elem, tmp) { waypoint *wpt = (waypoint *)elem; if (wpt->creation_time > 0) { - inside = ((wpt->creation_time >= start) && (wpt->creation_time <= stop)); + inside = ((wpt->GetCreationTime() >= start) && (wpt->GetCreationTime() <= stop)); } // If the time is mangled so horribly that it's // negative, toss it. diff --git a/gpsbabel/unicsv.cc b/gpsbabel/unicsv.cc index f9da2f0fe..a55d8254d 100644 --- a/gpsbabel/unicsv.cc +++ b/gpsbabel/unicsv.cc @@ -1179,15 +1179,15 @@ unicsv_parse_one_line(char *ibuf) ymd.tm_mon--; if (opt_utc) { - wpt->creation_time = mkgmtime(&ymd); + wpt->SetCreationTime(mkgmtime(&ymd)); } else { - wpt->creation_time = mklocaltime(&ymd); + wpt->SetCreationTime(mklocaltime(&ymd)); } } else if (ymd.tm_hour || ymd.tm_min || ymd.tm_sec) { if (opt_utc) { - wpt->creation_time = mkgmtime(&ymd); + wpt->SetCreationTime(mkgmtime(&ymd)); } else { - wpt->creation_time = mklocaltime(&ymd); + wpt->SetCreationTime(mklocaltime(&ymd)); } } @@ -1729,13 +1729,13 @@ unicsv_waypt_disp_cb(const waypoint *wpt) if (wpt->creation_time >= SECONDS_PER_DAY) { struct tm tm; char buf[32]; - time_t time = wpt->creation_time; + time_t time = wpt->GetCreationTime(); if (opt_utc) { time += atoi(opt_utc) * SECONDS_PER_HOUR; tm = *gmtime(&time); } else { - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *localtime(&tt); } tm.tm_year += 1900; @@ -1750,13 +1750,13 @@ unicsv_waypt_disp_cb(const waypoint *wpt) if (wpt->creation_time != 0) { struct tm tm; char buf[32], msec[12]; - time_t time = wpt->creation_time; + time_t time = wpt->GetCreationTime(); if (opt_utc) { time += atoi(opt_utc) * SECONDS_PER_HOUR; tm = *gmtime(&time); } else { - const time_t tt = wpt->creation_time; + const time_t tt = wpt->GetCreationTime(); tm = *localtime(&tt); } snprintf(buf, sizeof(buf), "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); diff --git a/gpsbabel/v900.cc b/gpsbabel/v900.cc index 405f084ed..24d8533cf 100644 --- a/gpsbabel/v900.cc +++ b/gpsbabel/v900.cc @@ -326,7 +326,7 @@ v900_read(void) int date, time; date = atoi(line.bas.common.date); time = atoi(line.bas.common.time); - wpt->creation_time = bintime2utc(date, time); + wpt->SetCreationTime(bintime2utc(date, time)); } wpt->speed = KPH_TO_MPS(atoi(line.bas.common.speed)); diff --git a/gpsbabel/vitosmt.cc b/gpsbabel/vitosmt.cc index 5ee3856ca..bee5e1f39 100644 --- a/gpsbabel/vitosmt.cc +++ b/gpsbabel/vitosmt.cc @@ -168,8 +168,8 @@ vitosmt_read(void) tmStruct.tm_sec =(int)floor(seconds); tmStruct.tm_isdst =-1; - wpt_tmp->creation_time = mkgmtime(&tmStruct); - wpt_tmp->microseconds = fmod(1000000*seconds+0.5,1000000); + wpt_tmp->SetCreationTime(mkgmtime(&tmStruct), + fmod(1000000*seconds+0.5,1000000)); wpt_tmp->shortname = (char*) xcalloc(16,1); snprintf(wpt_tmp->shortname, 15 , "WP%04d", ++serial); @@ -254,8 +254,8 @@ vitosmt_waypt_pr(const waypoint *waypointp) WriteDouble(&workbuffer[position], waypointp->altitude); } position += sizeof(double); - QDate date(waypointp->creation_time.date()); - QTime time(waypointp->creation_time.time()); + QDate date(waypointp->GetCreationTime().date()); + QTime time(waypointp->GetCreationTime().time()); workbuffer[position++] = date.year()-100; workbuffer[position++] = date.month(); workbuffer[position++] = date.day(); diff --git a/gpsbabel/vitovtt.cc b/gpsbabel/vitovtt.cc index c4cc2f606..f486a6488 100644 --- a/gpsbabel/vitovtt.cc +++ b/gpsbabel/vitovtt.cc @@ -111,8 +111,7 @@ vitovtt_read(void) tmStruct.tm_sec = scaled_sec / vitovtt_secondscale; microseconds = (scaled_sec % vitovtt_secondscale) / vitovtt_microsecondscale; - wpt_tmp->creation_time = mkgmtime(&tmStruct); - wpt_tmp->microseconds = microseconds; + wpt_tmp->SetCreationTime(mkgmtime(&tmStruct), microseconds); /* * TODO: interpret speed, course, status diff --git a/gpsbabel/vpl.cc b/gpsbabel/vpl.cc index 6eb21c77f..c1be36f80 100644 --- a/gpsbabel/vpl.cc +++ b/gpsbabel/vpl.cc @@ -209,7 +209,7 @@ vpl_parse_75_sentence(const char *ibuf) waypt->hdop = hdop_raw / (double) 8; waypt->vdop = vdop_raw / (double) 8; - waypt->creation_time = mkgmtime(&tm); + waypt->SetCreationTime(mkgmtime(&tm)); track_add_wpt(track_head, waypt); } diff --git a/gpsbabel/waypt.cc b/gpsbabel/waypt.cc index 4df831532..537a7fbb7 100644 --- a/gpsbabel/waypt.cc +++ b/gpsbabel/waypt.cc @@ -659,3 +659,22 @@ waypt_empty_gc_data(const waypoint *wpt) { return (wpt->gc_data == &empty_gc_data); } + +QString +waypoint::CreationTimeXML() const +{ + if (creation_time == 0) { + return NULL; + } + + QDateTime dt = QDateTime::fromTime_t(creation_time); + dt = dt.addMSecs(MICRO_TO_MILLI(microseconds)); + dt = dt.toUTC(); + + const char* format = "yyyy-MM-ddTHH:mm:ssZ"; + if (dt.time().msec()) { + format = "yyyy-MM-ddTHH:mm:ss.zzzZ"; + } + + return dt.toString(format); +} diff --git a/gpsbabel/wbt-200.cc b/gpsbabel/wbt-200.cc index 1f70d51e1..cd393da19 100644 --- a/gpsbabel/wbt-200.cc +++ b/gpsbabel/wbt-200.cc @@ -550,7 +550,7 @@ static waypoint *make_point(double lat, double lon, double alt, time_t tim, cons wpt->latitude = lat;; wpt->longitude = lon; wpt->altitude = alt; - wpt->creation_time = tim; + wpt->SetCreationTime(tim); wpt->shortname = xstrdup(wp_name); return wpt; diff --git a/gpsbabel/wfff_xml.cc b/gpsbabel/wfff_xml.cc index dca8454b1..5336c72fd 100644 --- a/gpsbabel/wfff_xml.cc +++ b/gpsbabel/wfff_xml.cc @@ -255,7 +255,7 @@ void wfff_e(const char *args, const char **unused) } } - wpt_tmp->creation_time = ap_first; + wpt_tmp->SetCreationTime(ap_first); waypt_add(wpt_tmp); diff --git a/gpsbabel/wintec_tes.cc b/gpsbabel/wintec_tes.cc index 5c1561dcd..1f1870b27 100644 --- a/gpsbabel/wintec_tes.cc +++ b/gpsbabel/wintec_tes.cc @@ -71,7 +71,7 @@ wintec_tes_read(void) wpt = waypt_new(); wpt->latitude = latitude / 1.0e7; wpt->longitude = longitude / 1.0e7; - wpt->creation_time = wintec_date_to_time(date); + wpt->SetCreationTime(wintec_date_to_time(date)); // The unit of altitude isn't clear and we have a lot of // samples with wildly negative values, so ignore those for now. wpt->altitude = alt; diff --git a/gpsbabel/xmlgeneric.cc b/gpsbabel/xmlgeneric.cc index a14d52988..80a863de1 100644 --- a/gpsbabel/xmlgeneric.cc +++ b/gpsbabel/xmlgeneric.cc @@ -22,6 +22,7 @@ #include "defs.h" #include "xmlgeneric.h" #include "cet_util.h" +#include #define DEBUG_TAG 0 #if DEBUG_TAG @@ -107,42 +108,30 @@ write_xml_entity_end(gbfile *ofd, const QString& indent, } void -xml_fill_in_time(char *time_string, const time_t timep, int microseconds, int long_or_short) +xml_fill_in_time(char *time_string, const time_t timep, int long_or_short) { - struct tm *tm = gmtime(&timep); - const char *format; - int n; - - if (!tm) { - *time_string = 0; - return; - } + QDateTime dt = QDateTime::fromTime_t(timep); + dt = dt.toUTC(); + const char* format; if (long_or_short == XML_LONG_TIME) { - format = "%02d-%02d-%02dT%02d:%02d:%02d"; + format = "yyyy-MM-ddTHH:mm:ssZ"; + if (dt.time().msec()) { +fprintf(stderr, "this should not be possible"); +abort(); + format = "yyyy-MM-ddTHH:mm:ss.zzzZ"; + } } else { - format = "%02d%02d%02dT%02d%02d%02d"; - } - n = sprintf(time_string, format, - tm->tm_year+1900, - tm->tm_mon+1, - tm->tm_mday, - tm->tm_hour, - tm->tm_min, - tm->tm_sec); - if (microseconds) { - n += sprintf(time_string + n, ".%03d", microseconds / 1000); + format = "yyyyMMddTHHmmssZ"; } - time_string[n++] = 'Z'; - time_string[n++] = '\0'; - + strcpy(time_string, qPrintable(dt.toString(format))); } void xml_write_time(gbfile *ofd, const time_t timep, int microseconds, const char *elname) { char time_string[64]; - xml_fill_in_time(time_string, timep, microseconds, XML_LONG_TIME); + xml_fill_in_time(time_string, timep, XML_LONG_TIME); if (time_string[0]) { gbfprintf(ofd, "<%s>%s\n", elname, diff --git a/gpsbabel/xmlgeneric.h b/gpsbabel/xmlgeneric.h index 77ad6c0d3..f299ba513 100644 --- a/gpsbabel/xmlgeneric.h +++ b/gpsbabel/xmlgeneric.h @@ -52,8 +52,7 @@ void write_xml_entity_end(gbfile* ofd, const QString& indent, const QString& tag void write_optional_xml_entity(gbfile* ofd, const QString& indent, const QString& tag, const QString& value); void xml_write_time(gbfile* ofd, const time_t timep, int microseconds, const char* elname); -void xml_fill_in_time(char* time_string, const time_t timep, int microseconds, - int long_or_short); +void xml_fill_in_time(char* time_string, const time_t timep, int long_or_short); void write_xml_header(gbfile* ofd); void xml_ignore_tags(const char** taglist); diff --git a/gpsbabel/xol.cc b/gpsbabel/xol.cc index 0f258f39a..59efe39fc 100644 --- a/gpsbabel/xol.cc +++ b/gpsbabel/xol.cc @@ -199,11 +199,9 @@ xol_fatal_outside(const waypoint *wpt) static void xol_write_time(const waypoint *wpt) { - char time_string[64]; - - xml_fill_in_time(time_string, wpt->creation_time, wpt->microseconds, XML_LONG_TIME); - if (time_string[0]) { - gbfprintf(fout, " timestamp=\"%s\"", time_string); + QString time_string = wpt->CreationTimeXML(); + if (!time_string.isEmpty()) { + gbfprintf(fout, " timestamp=\"%s\"", qPrintable(time_string)); } } -- 2.30.2